例としてClassFileAssembler
、sun.reflect
パッケージのクラスを考えてみましょう。
このクラスはパッケージ ローカル クラスです。
class ClassFileAssembler implements sun.reflect.ClassFileConstants {...
そのため、名前でさえ使用ClassFileAssembler
できず、直接インポートすることはできません。コンパイル エラーが発生します。
ただしsun.reflect
、プロジェクトでという名前のパッケージを作成し、そのClassFileAssembler
名前をこのパッケージ内で内部的に使用することはできます。Java コンパイラは、私たちがClassFileAssembler
のパッケージ内にいると認識します。
もしそうなら、なぜクラスオブジェクトへの参照を取得しようとしないのClassFileAssembler.class
ですか?
Class<ClassFileAssembler> classFileAssemblerClass = ClassFileAssembler.class;
予期せず、このコードは実行時エラーを引き起こします: java.lang.IllegalAccessError: tried to access class sun.reflect.ClassFileAssembler from class sun.reflect.Test
.
ClassFileAssembler
ただし、クラス オブジェクトを取得することはできます。
Class<ClassFileAssembler> aClass = (Class<ClassFileAssembler>)Class.forName("sun.reflect.ClassFileAssembler");
これは問題なく動作し、完全なクラスの説明が得られます。
したがって、質問は次のとおりです。
1) テクニックの違いは何ですか?Class.forName0
クラスオブジェクトへの参照を取得する方法とその方法.class
は?
2) なぜこのようにセキュリティチェックが異なるのですか?
.class
3)参照をそのように保護する理由は何ですか?
4) これらの手法は異なるクラスローダーを使用していますか?