0

私には3つのJavaプロジェクトA、B、Cがあります。BはAのアドオンのようなものです。AとBはどちらも、一部のクラスでプロジェクトCに依存しています。

プロジェクトAで、URLClassLoaderを次のように使用すると次のようになります。

URLClassLoader ucl = new URLClassLoader(urls); //urls are paths to some classes in B

これらのuclを使用しているときに、Bでいくつかのメソッドを呼び出すと、クラス定義が見つからないという例外が発生します。これはCであるクラス用です。

ClassLoaderを次のように使用すると、次のようになります。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader ucl = new URLClassLoader(urls, classLoader);

これは、Bのメソッドを呼び出すときに正常に機能します。私の質問:

1)最初の方法で行う場合、どのClassLoaderが使用されていますか?JavaDocsを読みましたが、説明できるものが見つかりませんでした。
2)依存関係の問題が発生しないように、プロジェクトBに固有のClassLoaderを取得する方法はありますか?これを何らかの方法で使用できますか?

助けてくれてありがとう。

4

2 に答える 2

1

デフォルトのクラス ローダーはシステム クラス ローダーです (クラスパスにクラスをロードします)。

特定のクラスローダーを使用して B にクラスをロードした場合は、そのインスタンスを使用します。そうでなければsomeTypeInB.getClass().getClassLoader()、ハックとして行います。

(注: を使用すると、信頼できないコードで使用するために必要な (実際には十分ではありませんが) セキュリティ対策が追加されるため、URLClassLoader.newInstance一般的にはnew URLClassLoaderを使用することをお勧めします。また、スレッド コンテキスト クラス ローダーを使用することは一般的に悪い考えです。ただし、スレッドはセットアップされて使用されます [これには、一貫したポリシーが適用されていない可能性があります]。)

于 2011-10-04T18:47:11.693 に答える
1

B のパスのみで初期化された最初の URLClassLoader を使用する場合、B の何かがロードのために C の何かを解決する必要がある場合、不足します。2 番目の形式を使用することで、「ここで必要なものが見つからない場合は、'親' クラス ローダーを調べてください」と言っています。これにより、C が解決され、全員が満足することができます。

(他のクラスを参照せずにロードできる唯一のクラスは Object であることを理解してください。それはストレッチです。クラスのスーパークラスを参照する必要があるだけではありません。少なくとも、ベース JDK のオブジェクトは、親 CL がない場合でもシステム クラス ローダーを使用できますが、別のクラスのメソッドを呼び出したり、別のクラスへのポインターを操作したりする場合は、参照されているクラスを解決する必要があります。)

于 2011-10-04T18:47:22.630 に答える