在我的例子中,我有两个包:package1
包含类A
(未声明为公共)及其嵌套静态类B
(声明为公共):
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
的实例不需要特殊的访问权限。这是正常的行为吗?
EDIT:如果我以不同的方式获得对内部类的引用,它也可以工作,像这样:
Class<?> innerClass = Class.forName("package1.A").getClasses()[0];
是的,这绝对没问题。当您编写像package.classname$innerclass
这样的代码时,您可以获得静态内部类。