小白版—理解反射
-
反射理解:利用好反射可以获取任意一类的各个组成部分(构造方法、成员变量、成员方法)
类的字节码—Class对象
类的成员变量—Field对象
类的成员方法—Method对象
类的构造方法—-Constructor对象
-
获取字节码(三种方式)
- Class clazz = Class.forName(“全类名”);
- Class clazz2 = 对象名.getClass();
- Class clazz3= 类名.class
-
反射获取Filed对象,并使用
clazz.getField();//获取单个公共的成员变量
clazz.getFields();//获取所有的公共的成员变量
clazz.getDeclaredField();//获取单个包括私有在内的成员变量
clazz.getDeclaredFields();//获取所有的包括私有在内的成员变量
//设置属性值
field对象.set(对象,属性值);
//获取属性值
object value = field对象.get(对象);
//暴力反射:如果一个变量是私有的才需要暴力反射,必须使用在设置和获取之前
field对象.setAccessible(true);
- 反射获取Method对象,并使用
clazz.getMethod();//获取单个公共的成员方法
clazz.getMethods();//获取所有的成员方法
clazz.getDeclaredMethod();//获取单个包括私有在内的成员方法
clazz.getDeclaredMethods();//获取所有包括私有在内的成员方法
//调用方法
method对象.invoke(对象,实际参数...);//实际参数根据需要可以不写,也可以写多个
//暴力反射
method对象.setAccessible(true);
- 反射获取Constructor对象,并使用
clazz.getConstructor();//获取单个公共的构造方法
clazz.getConstructor();//获取所有的公共的构造方法
clazz.getDeclaredConstructor();//获取单个包括私有在内的构造方法
clazz.getDeclaredConstructor();//获取所有的包括私有在内的所有的构造方法
//使用构造方法创建对象
contructor对象.newInstance();
//暴力反射
contructor对象.setAccessible(true);
tance();
//暴力反射
contructor对象.setAccessible(true);