おそらく、なぜそれをしたいのかと尋ねるでしょう-それは、静的初期化子で処理を行うクラス (外部ライブラリから) を使用していて、それが行われたかどうかを知る必要があるからです。
を調べましたClassLoader
が、役に立ちそうなものは見つかりませんでした。何か案は?
おそらく、なぜそれをしたいのかと尋ねるでしょう-それは、静的初期化子で処理を行うクラス (外部ライブラリから) を使用していて、それが行われたかどうかを知る必要があるからです。
を調べましたClassLoader
が、役に立ちそうなものは見つかりませんでした。何か案は?
メソッドを使用できますClassLoader.findLoadedClass()
。null を返す場合、クラスはロードされていません。この方法では、まだロードされていない場合はクラスをロードしません。
警告: このコードは実際には機能しません。システム ClassLoader ではfindLoadedClass()
保護されています。独自の ClassLoader でオーバーライドする必要があります。
クラスがシステム ClassLoader でロードされているかどうかを確認するには、同じトピックの以下のリンクを確認してください。
if(ClassLoader.getSystemClassLoader().findLoadedClass("java.lang.String") != null){
System.out.println("Yepee, String is loaded !");
}
@irreputable からの非常に良い点:
「読み込まれた」は「初期化された」という意味ではありません。初期化は、JLS3 $12.4.1 で定義された正確な瞬間にのみ発生します
そして私は引用します:
クラスまたはインターフェイスの型Tは、次のいずれかが最初に発生する直前に初期化されます。
- Tはクラスであり、Tのインスタンスが作成されます。
- Tはクラスであり、Tによって宣言された静的メソッドが呼び出されます。
- Tによって宣言された static フィールドが割り当てられます。
- Tによって宣言された静的フィールドが使用され、そのフィールドは定数変数ではありません(§4.12.4)。
- Tはトップレベルのクラスであり、T内で字句的にネストされた
assert
ステートメント(§14.10)が実行されます。
Class
クラスおよびパッケージ内の特定のリフレクション メソッドの呼び出しjava.lang.reflect
も、クラスまたはインターフェイスの初期化を引き起こします。クラスまたはインターフェイスは、他の状況では初期化されません。
資力 :
同じトピックで:
(参照の作成、インスタンスの作成、または静的メンバーへのアクセスによって) クラスを参照しないのはなぜですか? まだ起動していない場合は型初期化子を開始し、起動した場合はまだ問題ありません。
あなたはこのようなことを試すことができます:
クラスc=new ClassLoader(){クラスc = findLoadedClass(className); } .c;
-verbose フラグを使用して、クラスをロードするときに JVM にクラスを出力させることができます。これはあなたに役立つかもしれません。
java -verbose Dummy|head
[Opened C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.lang.String from C:\Program Files\Java\jre6\lib\rt.jar]
(ちなみに、これを Hello World プログラムで試してみたところ、309 個のクラスがロードされました!すごい)
手遅れでなければ..これもうまくいくはずです
Class.forName().newInstance();
これnewInstance()
は、この Class オブジェクトによって表されるクラスの新しいインスタンスを作成します。クラスは、空の引数リストを持つ新しい式によってインスタンス化されます。クラスがまだ初期化されていない場合は、クラスが初期化されます。
Class.forName("com.abc.Xyz", true, this.getClass().getClassLoader())
クラスが(それ自体または他のスレッドによって)初期化されるまでブロックされます