目の前の状況は、タイトルが示すように単純ではありません。
JWS 経由で実行される Java 1.6_17。
私はクラスを持っており、MyClass
そのインスタンスメンバー変数の1つは、クラスの初期化中に動的にいくつかの独自のクラスをロードしようとする誤ったサードパーティライブラリのタイプClass.forName(String)
です。これらのケースの 1 つで、たまたま動的に呼び出されます: Class.forName("foo/Bar")
.このクラス名は、バイナリ名の JLS に従っていないため、最終的にjava.lang.NoClassDefFoundError: foo/Bar
.
ClassLoader
サニタイズ メソッドを追加し、ClassLoader.findClass(String)
このClassLoader.loadClass(String)
問題を修正するカスタムがあります。
次のようなものを呼び出すことができます:
myCustomClassLoader.findClass("foo/Bar")
その後、問題なくクラスをロードします。しかし、事前にクラスをロードしても、後で例外が発生します。これは、MyClass
参照先Bar
の初期化中に、それらのClass.forName("foo/Bar")
コードがどこかの静的ブロックで呼び出されるためです。使用しようとしていた ClassLoader が私のカスタム クラス ローダーである場合、これは実際には問題ありません。しかし、そうではありません。そんな衛生管理をしてcom.sun.jnlp.JNLPClassLoader
いないのが私の問題です。
Thread.currentThread().getContextClassLoader()
カスタムクラスローダーに設定されていることを確認しました。しかし、これは (ご存知のように) 効果がありません。main()
私が読んだいくつかのもののために、私が最初に行うこととしてそれを設定しましたが、それでもMyClass.class.getClassLoader()
- JNLPClassLoader です。JNLPClassLoader ではなく、代わりに私のものを使用するように強制できれば、問題は解決しました。
クラスの初期化中に行われた静的な Class.forName("foo/Bar") 呼び出しを介して、どの ClassLoader を使用してクラスをロードするかを制御するにはどうすればよいですか? MyClass.class.getClassLoader()
カスタム クラス ローダーを強制的に返却できれば、問題は解決すると思います。
誰かがアイデアを持っているなら、私は他のオプションを受け入れます。
TL;DR:Class.forName(String)
によって参照されているサード パーティ ライブラリ内のすべての呼び出しを、MyClass
自分の選択したクラスローダーを使用するように強制するのを手伝ってください。