2013-04-30 65 views
0

在我的例子公共静态类的辅助,我有两个包:package1含有类A(未声明为public)及其嵌套静态类B(声明为public):反思 - 嵌套在包装局部类

package package1;  
class A { 
    public static class B { 
     public B() { 
     } 
    } 
    public A() { 
    }  
} 

package2包含Main类与试图反射性创建package1.A$B类的一个实例的简单方法主要:

package package2;  
public class Main {  
    public static void main(String[] args) { 
     try { 
      Class<?> innerClass = Class.forName("package1.A$B"); 
      Object o = innerClass.newInstance(); 
      System.out.println(o); 
     } catch (ReflectiveOperationException e) { 
      e.printStackTrace(); 
     } 
    }  
} 

Surprisin甘(至少对我来说),这段代码成功地做了一些事情,否则不可能没有反思。经典import声明(如import package1.A.B;import package1.A.*;)引发错误,认为类A不可见。此外,不需要特别的可访问性权限来创建B的实例。这是一种正常的行为吗?

编辑:它的工作原理也是,如果我以不同的方式得到内部类的引用,就像这样:

Class<?> innerClass = Class.forName("package1.A").getClasses()[0]; 
+0

如何创建一个非公开的'A'类?它是否是其他公开课的一部分? – sanbhat 2013-04-30 09:17:14

+0

说“不公开”我的意思是默认(包)可见性。 – maurizeio 2013-04-30 09:23:15

回答

0

是的,这是一个绝对的罚款。当你像package.classname$innerclass这样写时,你可以得到静态的内部类。

+0

好的,但在这种情况下,我期待在构造时产生一个'java.lang.IllegalAccessException' – maurizeio 2013-04-30 09:45:46

+0

当应用程序试图反射创建一个实例(不是数组)时,会引发IllegalAccessException,设置或获取一个字段或调用一个方法,但是当前正在执行的方法无法访问指定的类,字段,方法或构造函数的定义。 B类是公共和静态的,并且易于访问 – 2013-04-30 09:48:21

+0

好,但如果因为它是公共的而访问类B是合法的,为什么不能直接导入类'package1.A.B'? – maurizeio 2013-04-30 09:59:06