Javaクラスローダは、「重複クラス定義」のLinkageErrorを投げずに、クラスの新しいバージョンをロードするなど、クラスを複数回ロードできますか?Javaクラスローダがクラスを複数回ロードすることができます
つまり、クラスを動的にリロードする必要がある場合は、同じクラスローダーで行うことができますか、クラスローダーを先に破棄して新しいクラスをロードする新しいクラスを作成する必要があります?
Javaクラスローダは、「重複クラス定義」のLinkageErrorを投げずに、クラスの新しいバージョンをロードするなど、クラスを複数回ロードできますか?Javaクラスローダがクラスを複数回ロードすることができます
つまり、クラスを動的にリロードする必要がある場合は、同じクラスローダーで行うことができますか、クラスローダーを先に破棄して新しいクラスをロードする新しいクラスを作成する必要があります?
クラスローダーは実際にはクラスを一度しかロードできません。つまり、一度しか定義できません。それは何度も読み込むことができますが、初めて定義するときだけです。それ以外の時間には、初めて定義した既存のインスタンスをロードします。
クラスを2回定義しようとすると、 "duplicate class definition"がLinkageError
になります。そこにロードされるクラスの必要性があると何度もリロードした場合、これは、このような異なるクラスローダーによって行われなければならない:
あなたのクラスをロードしますあなた自身のクラスローダを作成します。クラスをリロードするには、クラスローダーを破棄して、クラスの新しいバージョンをロードする新しいインスタンスを作成する必要があります。
もちろん、これにより余分な負荷がかかりますが、必要であればOKです。
また、クラスローダーの古いインスタンスを破棄するときにクラスの参照が残っていないように注意してください。メモリリークが発生します。
同じ主題については、こちらも参照してください。http://zeroturnaround.com/blog/reloading-objects-classes-classloaders/(上記はほとんど説明しています) –
クラスをリロードする理由はクラスの変更です。このスペースでは、ホットスポットは自動的にクラスのリロードを気にします。だから、これについて気にする必要はありません。私はこれが役立つことを願っています
同じクラスローダでリロードができるかどうか質問します。 –
多分あなたは[OSGI](http://en.wikipedia.org/wiki/OSGi) – stivlo
が必要です。この質問に対する受け入れられた答えは非常に役に立ちます:http://stackoverflow.com/questions/148681/unloading-classes -in-java – laher