反射
什么是反射
归结为一句话:在运行时才知道操作的类,并且可以获取类的完整构造,并调用对应的方法。
反射能做什么
- 获取对象的属性,并且能对属性的值进行修改
- 获取任意类的名称、package信息,所有属性、方法、注解、类型、类加载器等等
- 实例化任意一个类的对象
- 调用任意对象的方法
- 判断任意一个对象所属的类
- 通过反射我们可以实现动态装配,降低代码的耦合度,动态代理
反射获取Class对象
Class<?> aClass = object.getClass();
Class clazz2 = User.class;
Class<?> aClass = Class.forName("类的全路径");
创建类对象
//class对象创建类对象
Object newInstance = aClass.newInstance();
//无参构造创建对象
Object o = aClass.getConstructor().newInstance();
//有参构造创建对象,String类的参数
Object o1 = aClass.getDeclaredConstructor(String.class).newInstance();
反射获取属性值和名称
public class ReflexTest {
private void getFiledData(Object object) throws IllegalAccessException {
Class<?> aClass = object.getClass();
//获取所有属性对象(public和非public)
//getDeclaredField(String name) 指定属性名称
Field[] fields = aClass.getDeclaredFields();
//父类
Class<?> superclass = aClass.getSuperclass();
Field[] superFields = superclass.getDeclaredFields();
for (Field superField : superFields) {
//关闭方法的公有或者私有检测
superField.setAccessible(true);
//属性值
Object filedValue = superField.get(object);
//属性名称
String filedName = superField.getName();
//修改属性值
Object newInstance = aClass.newInstance();
superField.set(newInstance,"修改后的值");
}
for (Field field : fields) {
field.setAccessible(true);
Object filedValue = field.get(object);
String filedName = field.getName();
}
}
}
反射获取方法
//指定获取方法
Method method = aClass.getMethod("方法名");
//获取所有public方法
Method[] methods = aClass.getMethods();
//指定获取public和非public的方法
Method declaredMethod = aClass.getDeclaredMethod("方法名");
//获取所有public和非public的方法
Method[] declaredMethods = aClass.getDeclaredMethods();
//调用方法
Object returnValue = declaredMethod.invoke("参数");
反射原理
Java项目编译时,java文件会被编译成.class文件,.class文件在程序运行时会被类加载器加载到JVM中,类被加载后,JVM就会自动产生一个Class对象,该对象就可以获取类的属性/方法/构造方法等等
反射的应用
spring的IOC 、动态配置、动态代理等等