Exception in thread "main" java.lang.NoSuchMethodException: com.anbo.reflect.classinfo.Person.setNam

来源:互联网 发布:linux 怎么指定核运行 编辑:程序博客网 时间:2024/06/03 22:41


如果把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);


控制台打印结果:


0 0