2011-05-20 3 views
5

問題:私のアプリケーションでは、互換性のないバージョンの3番目のライブラリを使用する2つのライブラリを使用しています。誰かがクラス分離のための方法を知っていますか?同じフルネームの2つの不完全なクラスの使用方法は?

クラスローダーについて聞いたことがありますが、どのように役立つのか理解できません。クラスの1つのバージョンをロードすると別のクラスをロードできません。クラスは既にロードされていますか?

私は春についても考えていますが、それがそのような分離を提供するかどうかはわかりません。

+0

私はそれを取る別の名前空間にこれらの2つのクラスはありませんか? –

+0

私は、Javaの文脈で "名前空間"の意味を理解していません。パッケージ名?重要であれば、それらを異なるパッケージに入れましょう。 – Nulldevice

+0

申し訳ありません、はい、私はパッケージを意味しました。また、私はあなたの質問を間違って読んだので、私はそれが適切だとは思わない! –

答えて

1

クラスをロードして別のクラスをロードできない場合は、 - クラス は既にロードされていますか?

クラスローダは、クラスのアイデンティティの一部とみなされます。別のクラスローダーによってロードされている場合は、別のクラスと見なされます。

+0

私たちはクラスをJavaオブジェクトとして扱うことができるのでしょうか?たとえば、それらを配列やリストに入れたり、複数のインスタンスを作成したりしますか? – Nulldevice

+1

@Nulldeviceクラスは、クラスローダによってバイトコードからのみインスタンス化できます。しかし、はい、それらはオブジェクトであり、配列やリストに入れることができます。私はClassLoadersだけがそのようなことをする必要があると思う。 –

2

基本的にClassLoaderは、JVMのクラスに意味を与える要素です。ルートはJVMにあり、Javaクラスをロードするための階層を形成します。 ApplicationClassLoaderは、アプリケーションのすべてのクラスをロードするため、考慮する必要がある最初のClassLoaderです。

クラスがロードされると、他のクラスへの参照はすべて解決され、これらのクラスがロードされます。 JVMは、デフォルトで、クラスローダーがクラスを既にロードしているかどうかを親に最初に問い合わせるシステムを提供します。そうでない場合、クラスパスで検索します。

2つのクラスローダーが2つの異なるクラスローダーに存在し、アプリクラスローダーには存在しない場合、2つのクラスを分離できます。それは難しくありません。親クラスとそのクラスパス(バイトコードがある場所)を指定してクラスローダー(URLClassLoaderなど)を作成するだけで、クラスをロードするように指示します。

親に尋ね、クラスがまだロードされていない場合、クラスパスを検索してロードします。同じ親に接続された別のクラスローダーを作成すると、最初のクラスによってロードされたクラスは、兄弟であるため、秒で決して表示されません。第二缶が

アプリケーションサーバはアプリケーション間の率直な分離を持っている代表団の別のフォームを使用し、非常に良い隔離だ何の問題

ことなく、同じ名前を持つクラスをロードします。 URLClassLoaderなどのクラスローダーを再定義し、クラスパスのクラスを最初に検索してから親クラスに問い合わせてから

-1

少なくとも1つのライブラリがオープンソースであり、それらが依存するライブラリがオープンソースであるため、クラスローダーを使いこなす必要はありません。依存するライブラリのバージョンのいずれかに含まれるすべてのパッケージの名前を一括して変更し、それらのパッケージを参照するすべてのコードも変更してください。ちょっとプレステ - 名前の衝突はありません。これは、XercesとXalanをバックグラウンドで使用していたSunがJDKで実際に行ったことです。

+0

〜50人のソフトウェアエンジニアによって開発されたプロジェクトだとすればどうなりますか?数千行のコードをバグ修正する責任は負いたくありません。オープンソースであっても、一部のライブラリのバージョンを変更するのは簡単ではありません。 – Nulldevice

+0

必要な名前を変更するスクリプトを作成し、リリースされたすべての新しいバージョンでそのスクリプトを実行できます。 'Class.forName'に気をつけてください。しかし、比較的単純です。 –

+0

先生、それは何万行ものコードを持っています - あなたは冗談を言っていますか? – Nulldevice