目录
脑容量不够了,以简单的小知识作为一天的结尾吧(悲
ReflectionUtils介绍
ReflectionUtils是Spring Framework中非常实用的一个工具类,为开发人员提供了简便的反射操作方法,使得处理反射相关任务变得更加高效和便捷。
常用方法
访问字段
1.ReflectionUtils.findField:
- 介绍:该方法用于在类的继承层次结构中查找指定名称的字段,并返回该字段对象。
- 示例:
public class MyClass {
private String name;
// getter and setter
}
Field field = ReflectionUtils.findField(MyClass.class, "name");
System.out.println("Field name: " + field.getName());
2.ReflectionUtils.setField:
- 介绍:该方法用于设置指定对象的指定字段的值。
- 示例:
public class MyClass {
private String name;
// getter and setter
}
MyClass obj = new MyClass();
Field field = ReflectionUtils.findField(MyClass.class, "name");
ReflectionUtils.setField(field, obj, "Alice");
System.out.println(obj.getName());
方法调用
3.ReflectionUtils.findMethod:
- 介绍:该方法用于在类的继承层次结构中查找指定名称和参数类型的方法,并返回该方法对象。
- 示例:
public class MyClass {
public void greet(String name) {
System.out.println("Hello, " + name + "!");
}
}
Method method = ReflectionUtils.findMethod(MyClass.class, "greet", String.class);
System.out.println("Method name: " + method.getName());
4.ReflectionUtils.invokeMethod:
- 介绍:该方法用于调用指定对象的方法。可以传递方法名和参数值进行调用。
- 示例:
public class MyClass {
public void greet(String name) {
System.out.println("Hello, " + name + "!");
}
}
MyClass obj = new MyClass();
ReflectionUtils.invokeMethod(ReflectionUtils.findMethod(MyClass.class, "greet", String.class), obj, "John");
处理回调
5.ReflectionUtils.doWithFields:
- 介绍:该方法遍历类的所有字段并对其执行指定的操作。可以使用lambda表达式来定义具体的操作。
- 示例:
public class MyClass {
private String name;
private int age;
// getters and setters
}
ReflectionUtils.doWithFields(MyClass.class, field -> {
System.out.println("Field name: " + field.getName());
});
6.ReflectionUtils.doWithMethods:
- 介绍:该方法遍历类的所有方法并对其执行指定的操作。可以使用lambda表达式来定义具体的操作。
- 示例:
public class MyClass {
public void sayHello() {
System.out.println("Hello!");
}
// other methods
}
ReflectionUtils.doWithMethods(MyClass.class, method -> {
if (method.getName().startsWith("say")) {
method.invoke(new MyClass());
}
});
示例
MethodInvokeTypeProvider#readObject
private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException {
inputStream.defaultReadObject();
Method method = ReflectionUtils.findMethod(this.provider.getType().getClass(), this.methodName);
this.result = ReflectionUtils.invokeMethod(method, this.provider.getType());
}
这段代码调用了 ReflectionUtils 先是 findMethod
返回 Method 对象然后紧接着调用 invokeMethod
反射调用。注意,这里的调用是无参调用。