一、ReflectionUtils
在 Java
中,反射(Reflection
)是一种强大的机制,允许程序在运行时动态地检查类、获取类的信息、调用类的方法、访问或修改类的属性等。Java
的反射机制提供了一组类和接口,位于 java.lang.reflect
包中,通过反射可以动态加载类、动态获取类的信息、动态创建对象、动态调用方法、动态访问和修改属性等。
在 Spring Framework
中也有一个也反射相关的工具类,那就是 ReflectionUtils
,它位于 org.springframework.util
包中,简化 Java
反射操作,提供了以下几个功能:
-
遍历类的属性和方法:提供了静态方法
doWithFields()
和doWithMethods()
,允许你遍历一个类的所有属性和方法,并且可以对每个属性和方法执行自定义的操作。 -
查找指定名称的属性和方法:提供了方法
findField()
和findMethod()
,用于查找类中指定名称的属性和方法。 -
执行方法:提供了方法
invokeMethod()
,可以用于执行类中的方法。 -
获取和设置属性值:提供了方法
getField()
和setField()
,可以用于获取和设置类的属性值。 -
复制属性值:提供了方法
shallowCopyFieldState()
,可以用于将源对象的属性值复制到目标对象中。
1. 获取类的属性
public class Test1 {private String name;private String sex;private int age;public static void main(String[] args) {ReflectionUtils.doWithFields(Test1.class, field -> {System.out.println("field name: " + field.getName());System.out.println("field type: " + field.getType());});}}
2. 获取属性的内容
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Test2 {private String name;private String sex;private int age;public static void main(String[] args) {Test2 target = new Test2("张三", "男", 21);ReflectionUtils.doWithFields(target.getClass(), fieldName ->Optional.ofNullable(ReflectionUtils.findField(target.getClass(), fieldName.getName())).ifPresent(field -> {ReflectionUtils.makeAccessible(field);Object value = ReflectionUtils.getField(field, target);System.out.println("fileName: " + fieldName.getName() + " , value: " + value);}));}
}
3. 动态修改属性的值
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Test2 {private String name;private String sex;private int age;public static void main(String[] args) {Test2 target = new Test2("张三", "男", 21);Field field = ReflectionUtils.findField(target.getClass(), "sex");assert field == null;ReflectionUtils.makeAccessible(field);ReflectionUtils.setField(field,target,"女");System.out.println(target.toString());}
}
4. 动态执行方法
public class Test3 {public void t1() {System.out.println("this is t1 method ! ");}public String t2(String param) {return "this is t2 method ! param: " + param;}public static void main(String[] args) {Test3 target = new Test3();Method t1 = ReflectionUtils.findMethod(target.getClass(), "t1");assert t1 != null;ReflectionUtils.invokeMethod(t1, target);Method t2 = ReflectionUtils.findMethod(target.getClass(), "t2", String.class);assert t2 != null;String res = (String) ReflectionUtils.invokeMethod(t2, target, "测试");System.out.println(res);}}