1.反射基本概念
正射-实例化
Apple apple=new Apple();//直接初始化,[正射] apple.setPrice(4);
反射就是在运行时才知道要操作的类时什么,并且可以在运行时获取类的完整构造,并调用对应的方法
class clz=class.forName("cn.webrx.Apple"); Method method=clz.getMethod("setPrice",int.class); Construtor constructor=clz.getConstructor(); Object object=constructor.newInstance();//相当于new Apple(); method.invoke(object,4);//相当于apple.setPrice(4)
java.lang.reflect包
java.lang.reflect包提供了反射中用到的类,主要的类说明如下:
Constructor类:提供类的构造方法信息。
Field类:提供类或接口中成员变量信息。
Method类:提供类或接口成员方法信息。
Array类:提供了动态创建和访问Java数组的方法
Modifier类:提供类和成员访问修饰符信息。
通过反射创建类对象
通过反射创建类对象主要有两种方式:通过Class对象的newInstance()方法,通过Constructor对象的newInstance()方法。
第一种通过Class对象的newInstance()方法。
Class clz=Apple.class; Apple apple=(Apple)clz.newInstance();第二种;通过Constructor 对象的newInstance()方法
Class clz=Apple.class; Constructor constructor=clz.getConstructor(); Apple apple=(Apple)constructor.newInstance();通过Constructor对象创建类对象可以选择特定构造方法,而通过Class对象则只能使用默认的无参数构造方法。下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。
Class clz=Apple.class; Constructor constructor =clz.getConstructor(String.class,int,class); Apple apple=(Apple)constructor.newInstance("红富士",15)
通过反射获取类属性、方法、构造器
我们通过Class对象的getFields()方法可以获取Class类的属性,但无法获取私有属性。
Class clz =Apple.class; Field[] fields=clx.getFields(); for(Field field:fields){ System.out.println(field.getName()); } //输出结果:price如果使用Class对象的getDeclardFields()方法则可以获取包括私有属性在内的所有属性:
Class clz=Apple.class; Field[] fields=clz.getDeclareFields(); for(Field field:fields){ System.out.println(field.getName()); } //输出结果:name //price