私の例では、クラスを含む (パブリックとして宣言されていない) とそのネストされた静的クラス (パブリックとして宣言されている) の 2 つのパッケージがpackage1
ありA
ますB
。
package package1;
class A {
public static class B {
public B() {
}
}
public A() {
}
}
package2
Main
class のインスタンスを反射的に作成しようとする単純な 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];