4

私は疑問に思っています。Javaでクラスのロードを遅らせる方法があるかどうかを判断するために、無数の複雑な検索用語を試しました。つまり、クラスはクラス/ビルドパスにありますが、起動時にロードされたくありません。これにより、間違ったクラスローダーが使用されます。

選択的かどうかにかかわらず、デフォルトのクラスローダーが特定のクラス/ JARをロードするのを遅らせたり阻止したりできますか?

(ビルドパスにサードパーティのjarを使用):

// boilerplate main
JarWrapper apiJar = SpecialJarLoader("api.jar"); // SpecialJarLoader is a proprietary class loader
Class apiClass = apiJar.loadClass("org.company.comm.AConnection"); // runtime failure here due to the class already being loaded

ビルドパスからJarを削除すると、予想どおりapiClass.getClassLoader()が独自のローダーになります。問題は、「org.company.comm.AConnection」またはJar内の他のクラス(IDEのオートコンプリートを含む)が実際にはビルドパス上にないため、自由に使用できないことです。

4

2 に答える 2

5

クラスは、最初に使用されたときにのみロードされます。したがって、クラスは起動時にロードされませんが、最初はこのクラスの何か(静的メソッド、型宣言などを含む)が必要になります。したがって、デフォルトの動作では、ロードは可能な限り遅延されます。

ロード時間を制御したい場合は、ClassLoaer.loadClass()を介してクラスを明示的にロードできます。クラスが何らかのインターフェイスでラップされている場合は、そのインターフェイスでのみコードにアクセスして(したがって、クラスが依存関係のチェーンによってロードされないようにする)、それをロードして(ClassLoader.loadclass())、実際にインスタンス化することができます。このクラスのインスタンスが必要です。

于 2012-10-01T20:16:54.080 に答える
0

これを行う唯一の方法は、JNIを使​​用して(つまり、Cで)カスタムJAVAローダーを作成することです。

このようにして、クラスを選択的にロードできます。

于 2012-10-01T20:18:03.583 に答える