Javaアプリケーションがスタンドアロンで実行される単一のJavaスレッドでクラスローディングパスを反転することは可能ですか?Javaスレッドでクラスの逆順を並べ替える
他のすべてのスレッドは正しく動作し、クラスパスを前後に検索しますが、一方のスレッドはクラスパスを先頭から順に検索します。
Javaアプリケーションがスタンドアロンで実行される単一のJavaスレッドでクラスローディングパスを反転することは可能ですか?Javaスレッドでクラスの逆順を並べ替える
他のすべてのスレッドは正しく動作し、クラスパスを前後に検索しますが、一方のスレッドはクラスパスを先頭から順に検索します。
実際のユースケースは何ですか?なぜ、そのスレッドだけで逆の順序でルックアップする必要があるのですか?
独自の顧客クラスローダを作成して、クラスパスの逆順でルックアップを行い、thread.setContextClassLoader(..)apiを使用してそのスレッドのコンテキストクラスローダとしてクラスローダを設定することができます。次に、そのコンテキストクラスローダーを明示的に使用して、クラスやその他のリソースをロードします。
しかし、警告のカップル:
1)一般的にクラスローダーが親first..Which手段です、uはカスタムクラスローダを作成するときにuはいずれかを使用していない限り、uは、親クラスローダ(一般的にシステムクラスローダーを設定しますアプリケーション内の他のカスタムローダー)。そうでなければ、ルートであるブートストラップローダーによってのみロードできるjava。*クラスをロードすることはできません。ルールごとに、最初にクラスローディング要求を親に委譲し、見つからない場合にのみ、それをロードする必要があります。したがって、親を試してみると、元の順番で検索してクラスをロードします。このためには、このルールを破る必要があります。最初に親に委譲するのではなく、クラスローダーで逆にルックアップする必要があります。見つからない場合にのみ親クラスローダーに委譲してロードしてください
2)親クラスローダーがすでにクラスをロードしている場合はurクラスローダが再度ロードする可能性があります。つまり、このスレッドにロードされたクラスは別のインスタンスとしてみなされます。
これは決して試したことはありませんが、理論的にはこれはうまくいくはずですが、すべての実用的な目的では、(2)で述べた理由で役に立たないかもしれません。
これらのリンクは有用であろう:link1link2link3
、ちょうどあなたのシステムクラスローダーを変更し、uはロード時に/あなたは、現在のスレッド名をもとにしたい方の順序で検索し、クラスを見つけているもう一つの方法。
両方のアプローチは奇妙ですが、要件はの:-)
する可能性のある重複したようなものである[はそれぞれ1で異なるクラスパスに2つのスレッドを持つことは可能ですか?](http://stackoverflow.com/questions/3522332/is-possible-to-have-two-child-threads-with-different-classpath-in-one-one) – Andreas
あなたは何を目標ですか?なぜあなたはクラスローディングパスの順序を逆にしたいのですか? –