反射就是将java类中的各种成分映射成一个个java对象。例如一些成员变量、方法、构造方法、包等等,利用反射技术能将这些组成元素解刨成一个个独立的对象。
下面是通过className获取到构造方法并重新写入值的几种方式:
“正”:
反射(一):
反射(二):
以上写法结果都是一样的。
第三种反射操作详解如下:
1.通过类名地址或者类对象实例
Class clz = Class.forName(“类名地址”);
2.构造函数对象
Constructor appleConstructor = clz.getConstructor();
3.通过newInstance方法获取反射类对象
Object enObj = appleConstructor.newInstance();
4.在反射对象里获取set方法
Method setUserName = clz.getMethod(“setUserName”, String.class);
5.最后通过invoke方法调用set方法与构造方法对象连接赋值
setUserName .invoke(enObj,“陈静雯”);
反射常用的一些API归纳及自己的理解:
1.首先要获取到Class类,才能将类中已分解的构造方法,函数,成员变量提取出来。
1)在已知全路径的情况下,适用于属性特别多的类,修改其中某个属性值,不方便查找的情景。
Class className = Class.forName(com.neo.drools.domin.selfUser);
2)在已知类名的情况下可以直接使用.class
Class clz = selfUser.class;
3)getClass()
selfUser selfUserObj = new selfUser();
Class clz = selfUserObj.getClass();
2.获取到类对象后需要创建类对象(newInstance())
两种途径,一种是通过Class对象创建,另一种是通过Construtor对象创建
1)Class clz = selfUser.class;
selfUser selfUser= (selfUser)clz.newInstance();
2)Class clz = selfUser.class;
Constructor constructor = clz.getConstructor();
selfUser selfUser = (selfUser)constructor.newInstance();
3.补充:通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用
默认的无参数构造方法。下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。
Class clz = selfUser.class;
Constructor constructor = clz.getConstructor(String.class, int.class);
Apple apple = (Apple)constructor.newInstance(“红富士”, 15);
4.获取属性名字
Class clz = selfUser.class;
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}