示?
- 通过
Class
类的getMethod(String name,Class...parameterTypes)
方法取得一个Method
对象,并设此方法操作时所需要的参数类型
- 之后使用
Object invoke(Object obj,Object[] args)
进行调用,并向方法中传递要设置的obj
对象的参数信息
Object
对应原方法的返回值,若原方法无返回值,此时返回null
- 若原方法为静态方法,此时形参
Object obj
可为null
- 若原方法形参列表为空,则
Object[] args
为null
- 若原方法声明为
private
,则需要在调用此invoke()
方法前,显式调用方法对象的setAccessible(true)
方法,将可访问private
的方法
Method
和Field
、Contructor
对象都有setAccessible()
方法
setAccessible
作用是启动和禁用访问安全检查的开关
- 参数值为
true
则指示反射的对象在使用时应该取消Java语言访问检查
- 提高反射效率。如果代码中必须用反射,而该句代码需要频繁的被调用,那么设置为true
- 使得原本无法访问的私有成员也可以访问
- 参数值为
false
则指示反射的对象应该实施Java语言访问检查
public class Test09 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获得Class对象
Class<?> aClass = Class.forName("com.fl.reflection.User");
//构造一个对象
User user = (User) aClass.newInstance(); //本质是调用了User的无参构造器
System.out.println(user);
//通过构造器创建对象
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, int.class);
User user1 = (User) declaredConstructor.newInstance("小白", 001, 18);
System.out.println(user1);
//通过反射调用普通方法
User user2 = (User)aClass.newInstance();
//通过反射获取一个方法
Method setName = aClass.getDeclaredMethod("setName", String.class);
setName.invoke(user2,"AAA");
System.out.println(user2.getName());
//通过反射操作属性
User user3 = (User)aClass.newInstance();
Field name = aClass.getDeclaredField("name");
//不能直接操作私有属性,我们需要关闭程序的安全检测, 属性或方法的setAccessible(true)
name.setAccessible(true);
name.set(user3,"BBB");
System.out.println(user3.getName());
}
}