【发布时间】:2011-08-22 12:18:33
【问题描述】:
我有两个编译单元:
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();
}
}
}
如果它们在同一个包中,则一切正常并打印“response: testing123”。如果它们位于不同的包中,则会引发 IllegalAccessException。
据我了解,引发异常是因为 CallingClass 无法调用私有 InnerClass 方法。但我不明白的是为什么它允许在同一个包中? InnerClass 不受包保护。 Private 不应该在 OuterClass 之外可见,即使它在同一个包中。我是不是理解错了?
【问题讨论】:
-
您命名为
InnerClass的类不是内部类。它实际上是一个静态嵌套类。 (在 Java 中,嵌套类有两种:静态和内部。)您提出了一个很好的问题,但它与内部类没有任何关系,所以我建议您重命名InnerClass以及标题问题。
标签: java reflection visibility inner-classes