背景介绍
- 在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);