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


如果把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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值