2

javaClassLoadersについて質問があります。同じプログラム内から異なるバージョンのJARを実行できるように、異なるClassLoaderを使用しようとしています。

1つのClassLoaderを使用して1つのクラスをロードすると、そのクラス内から呼び出される(ロードされる)すべてのクラスが同じClassLoaderを使用するということをどこかで聞いたことがあります。これは正しいです?

そうでない場合は、ClassLoaderのコンテキストを設定するための適切な方法があります(たとえば、特定のクラス/ライブラリから呼び出されるすべてのものは同じClassLoaderを使用する必要があります)。

4

1 に答える 1

4

これは単純なテーマではありません。オンラインでさらに調査を行うことをお勧めします。しかし、簡単な概要として:

  • 通常のクラス参照 (静的型 B の変数を使用するクラス A のコード行) を介してロードされるクラスは、初期クラスと同じクラスローダーを使用してロードされます。
  • ただし、クラスローダの委任により、最初に検索を開始した ClassLoader によってクラスが実際にロードされない場合があります。たとえば、親クラスローダー LP を持つクラスローダー LA によってクラス A がロードされています。クラス B は A によって参照されるため、クラス B の検索は LA から開始されます。ただし、B のクラス バイトは実際には LP にあるため、LP はクラスをロードし、それを返す LA に渡します。ただし、最終的に B はLAではなくLP によって所有されます。
  • リフレクション (シリアライゼーション、JAXB、Hibernate など) を介してクラスをロードするユーティリティ、またはネストされたクラスローダー (Java EE アプリケーションサーバーなど) で通常使用されるフレームワークでは、すべての賭けはオフです。 通常、このようなユーティリティ/フレームワークは、コンテキスト classloaderを使用してクラスをロードしますが、常にそうとは限りません。各ユーティリティには、使用するクラスローダに関する優先度とフォールバックが異なる場合があります。さらに、多くの場合、実行時にクラスローダーを明示的に提供する方法があります。

経験則として、ネストされたクラスローダからのものであることがわかっているコードを実行している間 (おそらくそれを設定したため)、現在のコンテキスト クラスローダを適切に設定する必要があります。

于 2012-11-13T02:44:32.153 に答える