mar*_*its 11 java reflection visibility inner-classes
我有两个编译单元:
public class OuterClass{
private static class InnerClass{
public String test(){
return "testing123";
}
}
public static void main( String[] args ){
new CallingClass().test( new InnerClass() );
}
}
public class CallingClass{
public void test( Object o ){
try{
Method m = o.getClass().getMethod( "test" );
Object response = m.invoke( o );
System.out.println( "response: " + response );
}
catch( Exception e ){
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果它们在同一个包中,一切正常并且打印出"response:testing123".如果它们位于单独的包中,则抛出IllegalAccessException.
据我所知,抛出异常是因为CallingClass无法调用私有的InnerClass方法.但我不明白为什么在同一个包中允许它?InnerClass不受包保护.即使它在同一个包中,也不应在OuterClass外看到Private.我理解错了吗?
内部类的javap签名:
class modifiers.OuterClass$InnerClass extends java.lang.Object{
final modifiers.OuterClass this$0;
public java.lang.String test();
}
Run Code Online (Sandbox Code Playgroud)
说到字节码(即运行时),就没有私有类这样的东西.这是编译器维护的虚构.对于反射API,有一个包可访问类型,带有公共成员方法.
实际访问修饰符在JVM规范中定义:
Flag Name Value Interpretation
ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its package.
ACC_FINAL 0x0010 Declared final; no subclasses allowed.
ACC_SUPER 0x0020 Treat superclass methods specially when invoked by the
invokespecial instruction.
ACC_INTERFACE 0x0200 Is an interface, not a class.
ACC_ABSTRACT 0x0400 Declared abstract; may not be instantiated.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1939 次 |
| 最近记录: |