Spring - 反射
反射介绍
Java的反射机制是在运行的状态中,对于任意的一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,能够调用它的任意一个属性和方法,这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射机制。简单一句话,反射技术可以对类进行解剖。
字节码文件对象获取的三种方式
- 有对象,通过 对象.getClass(); 获取
Person p = new Person(); //对象
Class<? extends Person> class1 = p.getClass(); //获取
- 有类名,通过 类名.class; 获取
Class<? extends Person> class2 = Person.class;
- 有权限定类名,通过 Class.forName("权限定类名"); 获取
Class.forName("com.aishang.java.Person"); //包名+类名
创建对象的五种方式
- new 对象
- 字节码文件对象.newInstance(); 创建对象
Class clazz = Class.forName("com.aishang.java.Person");
Person person = (Person)clazz.newInstance();
- 构造器创建对象 constructor.newInstance("张三",20);
public void fun4() throws Exception{0
Class clazz = Class.forName("com.aishang.java.Person");
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor constructor = clazz.getConstructor(String.class,Integer.class);
Person p = (Person)constructor.newInstance("张三",20);
System.out.println(p.toString());
}
- Object.clone(); 快速创建对象的副本
- 反序列化
字段(成员变量)的获取
- 获取所有权限的字段
clazz.getDeclaredFields();
- 获取所有public权限的字段(成员变量)
clazz.getFields();
- 获取任意字段(成员变量)
clazz.getDeclaredField("字段名");
- 赋值:如果该字段为私有访问权限则加暴力访问
field.set(对象, 参数);
- 暴力访问
field.setAccessible(true);
方法的获取
- 获取本类及父类公有的方法
clazz.getMethods();
- 获取本类所有方法
clazz.getDeclaredMethods();
- 获取私有方法
Object invoke = method.invoke(对象(若为静态方法可为null), 参数列表); //invoke 为返回值