これが私が遭遇している問題です。Java 1.3 で実行され、MyAPI v1.0 などの外部 API を使用する巨大なレガシー アプリケーションがあります。MyAPI 1.0 の正確な実装は、アプリが使用するクラスパスのどこかにあります。そのアプリが外部コードを使用できるようにするメカニズムもあります (ある種のプラグイン メカニズム)。現在、MyAPI v2.0 (v1.0 との 100% 下位互換性はありません) を使用する別の Java ライブラリ (MyLib.jar) があり、そのプラグイン メカニズムを使用して元のアプリから使用する必要があります。そのため、どうにかして、同じ API の 2 つの (互換性のない!) バージョンを連携させる必要があります。具体的には、API クラスが MyLib.jar クラスから呼び出される場合は MyAPI v2.0 を使用し、それ以外の場合はすべて MyAPI 1.0 を使用したいと考えています。
MyAPI 1.0 はクラスパスにあるので、デフォルトで使用されます。それで問題ありません。MyAPI 2.0 からクラスをロードする独自のバージョンのクラス ローダーを作成できます。問題ありません。しかし、どうすればすべてを合わせることができますか?質問:
MyLib.jar オブジェクトは、MyAPI 2.0 からのクラスの多くの (!) インスタンスをインスタンス化します。これは、これらすべてのインスタンス化をリフレクション (自分のクラスローダーを指定) を介して行う必要があるということですか? とんでもない作品だ!
MyAPI 2.0 オブジェクトの一部がインスタンス化され、MyAPI から別のオブジェクトを内部的にインスタンス化する場合、どのクラスローダーを使用しますか? クラスローダーまたはデフォルトのクラスローダーを使用しますか?
一般的に、私のアプローチは合理的に聞こえますか? より良い方法はありますか?