目の前の状況は、タイトルが示すように単純ではありません。
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自分の選択したクラスローダーを使用するように強制するのを手伝ってください。