java中的反射
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class MyClass {
private int num;
public MyClass() {
this.num = 0;
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
public void display() {
System.out.println("Value: " + num);
}
}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 动态创建对象
Class<?> myClass = Class.forName("MyClass");
MyClass obj = (MyClass) myClass.getDeclaredConstructor().newInstance();
// 获取并调用方法
Method setNumMethod = myClass.getDeclaredMethod("setNum", int.class);
setNumMethod.invoke(obj, 42); // 调用 setNum 方法设置字段值
// 获取并设置字段值
Field numField = myClass.getDeclaredField("num");
numField.setAccessible(true); // 设置私有字段可访问
int value = (int) numField.get(obj); // 获取字段值
System.out.println("Value: " + value);
// 调用对象的方法
Method displayMethod = myClass.getDeclaredMethod("display");
displayMethod.invoke(obj); // 调用 display 方法
}
}
这个例子中,首先使用Class.forName()
方法动态加载了类MyClass
,然后使用getDeclaredConstructor().newInstance()
方法动态创建了类的对象。接着,使用getDeclaredMethod()
方法获取了setNum
方法和display
方法,并通过invoke()
方法动态地调用了这两个方法。最后,使用getDeclaredField()
方法获取了类的私有字段num
,并通过setAccessible(true)
方法设置为可访问,然后使用get()
方法获取字段值,再次使用invoke()
方法调用了display
方法。
这个例子演示了反射机制的基本用法,但请注意,反射机制的使用应谨慎,因为它会增加代码的复杂性和运行时的性能开销。
枚举,泛型
设计模式。