1 获取并调用方法
- 通过
Class.getDeclaredMethod(name, argType1, argType2, ...)
获取方法method
通过
method.invoke(obj, arg1, arg2, ...)
调用方法public class TestReflection {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class clazz = Class.forName("com.lht.reflection.User");
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);
User user = (User) constructor.newInstance("lirt", 210224);
System.out.println(user);
Method setName = clazz.getDeclaredMethod("setName", String.class);
setName.invoke(user, "new name");
System.out.println(user);
}
}
2 操作属性
- 通过
Class.getDeclaredField(name)
获取属性field
通过
field.set(obj, newField)
设置属性值public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
Class clazz = Class.forName("com.lht.reflection.User");
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);
User user = (User) constructor.newInstance("lirt", 210224);
System.out.println(user);
Field name = clazz.getDeclaredField("name");
name.set(user, "hahaha");
System.out.println(user);
}
但执行上述代码会报错,因为
user.name
属性是 private 的,不能直接访问。 如果想访问这个属性,就需要加入一行代码name.setAccessible(true);
来关闭安全检测。 同理,如果先访问私有方法,也需要method.setAccessible(true);
。