反射 - 嵌套在包本地类中的公共静态类的可访问性

时间:2013-04-30 09:10:59

标签: java reflection inner-classes class-visibility

在我的示例中,我有两个包:package1包含类A(未声明为public)及其嵌套的静态类B(声明为public):

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

package2包含一个Main类,其中包含一个简单的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();
        }
    }    
}

令人惊讶的是(至少对我而言),这段代码成功地做了一些没有反思的事情。经典import语句(如import package1.A.B;import package1.A.*;)会引发错误,认为类A不可见。此外,无需特殊的辅助功能权限来创建B的实例。这是正常行为吗?

编辑:如果我以不同的方式获得对内部类的引用,它也会起作用,如下所示:

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

1 个答案:

答案 0 :(得分:0)

是的,这绝对没问题。当您像package.classname$innerclass一样编写时,您可以获得静态内部类。