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); //提供参数,获取新实例
posted @ 2021-09-23 21:02  XXXTaye  阅读(39)  评论(0编辑  收藏  举报