06-反射
反射
反射是运行时(Runtime)的机制
可以通过对象的Class
对象获取类的所有信息,并暴力修改
1. 获取Class对象
Class cl = Class.forName("java.util.Random"); //调用静态方法Class.forName()
Employee e1 = new Employee(); //实例对象直接调用getClass,这个方法实在Object类中定义的
Class cl = e1.getClass();
Class cl = Employee.class; //直接类名后面加上.class
调用getName
可以获取类名
使用getSuperClass()获取超类Class对象
//如果没有超类则返回null
Class clSuper = cl.getSuperClass();
Class
Method
Field
Constructor
可以都调用getModifiers()获得修饰符
可以通过调用Modifier.toString()方法获取具体修饰符的字符串
Modifier.toString(cl.getModifiers()); //获取修饰符
2.获取Field字段
通过Class对象获取Field对象:
getField(String name); //返回所有公共成员变量,包括超类
getDeclaredField(String name); //访问所有成员变量,不包括超类的
//返回形式是数组
getFields();
getDeclaredFields();
拿到Field对象后,可以通过getType
获取类型,这是一个Class对象
Class getType(); //返回一个Class
String getName(); //返回字段名
设置字段值
拿到Field对象后,最重要的功能就是直接拿到这个字段值或者为这个字段赋一个新值
默认情况下,jvm不允许这样做,可以强行开启字段值的获取权限
field.setAccessible(true); //开启权限
然后就可以为获取字段值或者设置新值
//设置新值
field.set(Object obj,Object value);
//获取该对象的字段值
field.get(Object obj)
3.获取Method方法
//提供两个参数,方法名和参数类型
getMethod(String name, Class<?>... parameterTypes)
getDeclaredMethod(String name, Class<?>... parameterTypes);
//返回数组
getMethods();
getDeclaredMethods();
拿到方法后,可以获取返回类型和参数类型
getReturnType(); //获取返回类型
getGenericReturnType(); //获取返回类型
getParameterTypes(); //获取参数类型
getParameterCount(); //获取参数数量
getAnnotation(); //获取注解
当然,更重要的用途是通过这个Method对象来直接执行方法
只需要调用invoke
方法
invoke(Object obj, Object... args); //提供要执行的实例和参数,静态方法第一个参数为null
4.获取Constructor对象
获取参数、注解等方法和Method差不多
主要是也要提供相应的参数类型
主要比较有用的是通过Constructor对象直接生成一个实例
newInstance(Object ... initargs); //提供参数,获取新实例