java反射调用匿名内部类的public方法报can not access a member of class Test$1 with modifiers “public“

背景介绍

  • 在IrpcServerTest中声明匿名内部类并将实例放入实例字段map中
map.put(DemoService.class, new DemoService() {
      public String sayHello() {
        return "hello !";
      }
});
  • 在ServerHandler中反射调用实现DemoService接口的匿名内部类的public方法
  • ServerHandler跟IrpcServerTest不在一个包中,并且没有继承IrpcServerTest
 Object service = server.getServiceMap().get(rpcRequest.getTargetServiceName());
 method = service.getClass().getMethod(rpcRequest.getTargetMethod());
Object result = method.invoke(service);

代码执行method.invoke(service);时代码报错:
java.lang.IllegalAccessException: Class com.jaan.irpc.server.ServerHandler can not access a member of class com.jaan.irpc.test.IrpcServerTest$1 with modifiers “public”


疑问:为什么public修饰的方法通过反射无法调用?

java编译后idea中的显式问题

在本地文件系统查看java编译后匿名内部类会单独生成一个class文件
在这里插入图片描述
但是在idea中查看编译后的class文件是不显示这个匿名内部类的class文件的
在这里插入图片描述

将IrpcServerTest$1.java反编译,内容如下

final class IrpcServerTest$1 implements DemoService {
  IrpcServerTest$1() {
  }

  public String sayHello() {
    return "hello !";
  }
}

能看出类的访问修饰符为default(默认的),即只能在同一个包下访问

结论

  • 匿名内部类在编译后会生成一个单独的class文件,并且该class被default(默认的)修饰符修饰,即只能在同一个包下访问
  • 要想在其他包下访问只能,将方法设置为method.setAccessible(true);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值