如何理解反射调用成员

本篇内容主要讲解“如何理解反射调用成员”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解反射调用成员”吧!

成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站制作、苍南网络推广、小程序定制开发、苍南网络营销、苍南企业策划、苍南品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供苍南建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

反射调用成员

类结构中的最后一个核心的组成就是成员(Field),大部分情况下都会将其称为成员属性,对于成员信息的获取也是通过Class类完成,在这个类中提供了如下两组操作方法:
获取本类全部成员:
public Field[] getDeclaredFields() throws SecurityException
获取本类指定成员:
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException
获取父类全部成员:public Field[] getFields() throws SecurityException
获取父类指定成员:public Field getField(String name) throws NoSuchFieldException, SecurityException

范例:修改要操作的父类:
AbstractBase:

public abstract class AbstractBase {protected static final String BASE = "www.mldn.cn";private String info = "HELLO MLDN";public AbstractBase() {}public AbstractBase(String msg) {}
}

IChannelService:

public interface IChannelService {
    public static final String NAME = "mldnjava";
    public boolean connect();
}

范例:获取类中的成员

import java.lang.reflect.Field;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Class cls = Class.forName("cn.mldn.vo.Person");
        {    // 获取父类之中公共成员信息 Field fields [] = cls.getFields();  //获取成员 for (Field fie : fields) {
                System.out.println(fie);
             }
        }
        System.out.println("---------番茄酱与辣椒酱的分割线-------------");
        {  //获取子类中定义的成员Field fields [] = cls.getDeclaredFields();for (Field fie : fields){
                System.out.println(fie);
            }
        }
    }
}

执行结果:
如何理解反射调用成员

但是在Field类中最为重要的操作形式并不是获取全部成员,而是如下三个方法:
设置属性内容:
public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException
获取属性内容:
public Object get(Object obj) throws IllegalArgumentException, IllegalAccessException
解除封装:
public void setAccessible(boolean flag)
所有成员是在对象实例化后进行空间分配的,所以此时一定要先有实例化对象后才可以进行成员的操作。

范例:直接调用Person类中的name私有成员

import java.lang.reflect.Field;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Class cls = Class.forName("cn.mldn.vo.Person");
        Object obj = cls.getConstructor().newInstance();  //实例化对象(分配成员空间)Field nameField = cls.getDeclaredField("name");  //获取成员对象nameField.setAccessible(true);  //对私有属性必须先解除封装,nameField.set(obj,"番茄强");  //等价于:Person对象.name = "番茄强"System.out.println(nameField.get(obj));
    }
}

通过一系列的分析可以发现,类中的构造、方法、成员属性都可以通过反射实现调用,但是对于成员的反射很少这样直接处理,大部分操作都应该setter和getter处理,所以对于以上的代码只能够说是反射的特色,但是不具备实际的使用能力,而对于Field类在实际开发中只有一个方法最为常用:
获取成员类型:
public Class getType()
范例:获取Person类中name成员的类型

import java.lang.reflect.Field;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("cn.mldn.vo.Person");
        Field nameField = cls.getDeclaredField("name");System.out.println(nameField.getType().getName());  //获取完整的名称,包.类 java.lang.StringSystem.out.println(nameField.getType().getSimpleName());  // 获取类名称 String}
}

在以后开发中进行反射处理的时候,往往会利用Field类和Method类实现类中的setter方法的调用。

到此,相信大家对“如何理解反射调用成员”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


本文名称:如何理解反射调用成员
URL网址:http://ybzwz.com/article/psseho.html