目录
3.使用/访问private修饰的属性/方法时,使用setAccessible(true)越过权限检查
1.获得反射入口(或称反射对象)(第一步)
三个方法,如下:
//1.Class.forName(全类名)
Class<?> clazz1 = Class.forName("reflect.Person");
//2.Xxx.class
Class<?> clazz2 = Person.class;
//3.对象.getClass();
Person per = new Person();
Class<?> clazz3 = per.getClass();
---------------------------------
constructor/instance/method/field 都有getClass()方法
2.通过反射获得构造器、对象、方法、属性,进而操作
clazz.getxxx(): 获取clazz对象的public修饰符修饰的各种信息(接口、构造器、方法、属性等)
clazz.getDeclaredxxx: 获取clazz对象的所有修饰符修饰的各种信息(含private)
3.使用/访问private修饰的属性/方法时,使用setAccessible(true)越过权限检查
4.对象属性赋值
instance.setxxx();
method.invoke();
field.set();//反射赋值,不经过setter方法
5.动态引入文本内容
Properties prop = new Properties();
prop.load( new FileReader("src/Class.txt"));//FileReader
String className = prop.getProperty("classname");
String methodname = prop.getProperty("methodname");
Class<?> clazz = Class.forName(className);
6.赋值工具类(反射技术实现)
public static void setProperty(Object obj,String propertyName,Object value) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Class<?> clazz = obj.getClass();
Field field = clazz.getDeclaredField(propertyName);
field.setAccessible(true);//访问private修饰符限定的资源时,需要setAccessible(true)
field.set(obj, value);
}