反射(Reflection)

获得Class对象的三种方法:
1.类名.Class() : Class类对象阶段
2.Class.forName():一般用在有配置文件的情况下,Source 源代码阶段
3.对象名.getClass() :运行阶段,已经有了类的实例对象

Class 对象功能:

获得功能:
1.获得成员变量:
public Field[] getFields()throws SecurityException
返回包含一个数组Field对象反射由此表示的类或接口的所有可访问的公共字段类对象。
public Field getField(String name)throws NoSuchFieldException,SecurityException
返回一个Field对象,它反映此表示的类或接口的指定公共成员字段类对象。 name参数是一个String ,指定所需字段的简单名称。
public Field getDeclaredField(String name)throws NoSuchFieldException,SecurityException
返回一个Field对象,它反映此表示的类或接口的指定已声明字段类对象。 name参数是一个String ,它指定了所需字段的简单名称。
public Field[] getDeclaredFields()throws SecurityException
返回的数组Field对象反映此表示的类或接口声明的所有字段类对象。 这包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段。
获得到成员变量以后可以做以下操作:
1.获得成员变量的值:public Object get(Object obj)throws IllegalArgumentException,IllegalAccessException
2.设置成员变量的值:public void set(Object obj,Object value)throws IllegalArgumentException,IllegalAccessException 如果是静态成员变量,则忽略obj参数; 它可能为null
3.如果成员变量的权限是private,则需要先进行暴力反射,设置其可访问 public void setAccessible(boolean flag)throws SecurityException
2.获取构造方法后的操作:
Consrunctor这个类和Class类里面都有new Instance()方法
java.lang.Object
java.lang.Class<T>
public T newInstance() throws InstantiationException,IllegalAccessException
创建由此类对象表示的类的新实例。空参构造方法可以用此方法创建对象
java.lang.reflect
Class Constructor<T>
public T newInstance(Object... initargs)
使用由此Constructor对象表示的构造函数,使用指定的初始化参数创建和初始化构造函数的声明类的新实例

3.获得成员方法后的操作:(调用方法,获取方法名称)

改变配置来创建一个对象并调用其中的方法的案例:
public static void main(String[] args) throws Exception { //创建Properties 实例 Properties properties = new Properties(); //获取CommonFunction类的字节码文件(CommonFunction.class)并得到其类加载器 ClassLoader classLoader = CommonFunction.class.getClassLoader(); //获取类路径下的资源文件 InputStream is = classLoader.getResourceAsStream("Pro.properties"); //把配置中的文件加载到properties中 properties.load(is); //获取到配置文件中的数据 String className = properties.getProperty("className"); String method = properties.getProperty("method"); System.out.println(className+":"+method); //加载类进内存 Class clz = Class.forName(className); //创建类实例 Object obj = clz.newInstance(); //获取类中的方法对象并执行 clz.getMethod(method).invoke(obj); }
Reflection.Field.Person:sleep
Person sleep...


浙公网安备 33010602011771号