如果把Person类的setName方法的访问权限设为私有
private void setName(String name){
this.name=name;
}
这是再运行程序,则会抛出NoSuchMethodException异常
Exception in thread "main" java.lang.NoSuchMethodException: com.anbo.reflect.classinfo.Person.setName(java.lang.String)
at java.lang.Class.getMethod(Class.java:1607)at com.anbo.reflect.classinfo.TestReflection4.main(TestReflection4.java:18)
为什么会出现该错误呢?
这是因为当通过Method的invoke()方法调用对应的方法时,Java会要求程序必须有调用该方法的权限。如果程序确实需要调用某个对象的private方法,可以先调用setAccessible(Boolean flag)方法。将Method对象的Accessible标志设置为指示的布尔值,值为true则表示该Method在使用时应该取消Java语言访问权限检查。值为false则表示该Method在使用时应该实施Java语言访问权限检查。
解决方案:
1. 将Person类中setName方法的访问权限设为public(在不需要调用某个对象的private方法)
2. 不改变私有访问权限,先调用setAccessible(true)方法取消Java语言访问权限检查,在调用需要调用的方法。(确实需要调用某个对象的private方法)
//获取cla对象的指定方法"setName“方法
Method m=cla.getDeclaredMethod("setName", String.class);
//取消Java语言访问权限检查
m.setAccessible(true);
//调用m方法,传入参数
m.invoke(p, "huahua");
//获取cla对象的指定方法"getName()"方法
Method method=cla.getMethod("getName", null);
//调用method方法,传入参数
Object o=method.invoke(p, null);
System.out.println(o);
控制台打印结果: