4

カスタム ロジックを使用して 1 つのクラスをロードしようとしています (つまり、ライブラリ内のクラスの実装をカスタム バージョンに交換したい)。

デフォルトのクラスローダにプロキシする独自のカスタム クラスローダを作成したいと考えています。ただし、デフォルトの classloader:sun.misc.Launcher.AppClassLoaderが表示されないようです。つまり、拡張できません。

1 つの特定のクラスでサブビングしながら、既存のクラスローダーの動作を複製するのに十分な堅牢な単一のクラスローダーを作成するためのソリューションは、非常に高く評価されます。

私が使用しようとしたことに注意してください

Thread current = Thread.currentThread();
current.setContextClassLoader(newOne);

ただし、これは機能していないようです。つまり、スレッドにロードされたクラスが常にカスタム クラスローダーをトリガーするとは限りません。


環境

「new LibraryClass()」の呼び出しで、このクラスのカスタム実装を使用したいのですが、「new ...」の呼び出しは、私の管理下にないjarファイルにあります。

4

1 に答える 1

0

LibraryClassでは、同じ完全修飾名を使用してカスタム バージョンに置き換えたいと思いますよね?

オリジナルLibraryClassがすでにクラスパスにある場合、クラスローダーの階層が原因で、カスタム クラスローダーでこれを行うことはできません (「Java クラスの読み込みメカニズム」を参照)。

考えられる解決策の 1 つは、カスタムを含む jar をLibraryClassクラスパスの先頭に配置することです。カスタム クラスは、元のクラスに優先して読み込まれます。

LibraryClassがブートストラップまたは拡張クラスの場合、これは機能しません。

于 2013-07-05T19:48:06.210 に答える