在我的例子公共静态类的辅助,我有两个包: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];
如何创建一个非公开的'A'类?它是否是其他公开课的一部分? – sanbhat 2013-04-30 09:17:14
说“不公开”我的意思是默认(包)可见性。 – maurizeio 2013-04-30 09:23:15