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