4

私は、JVM と ClassLoaders についてはまったくの初心者です。私はこれらの2つのクラスを持っています:

public abstract class CoreModule extends Entity

public final class EventManager extends CoreModule

プログラムの開始時に、 のインスタンスを作成しますEventManager。は孫であるため、JVMEntityはクラスとそのロード方法を知っている (つまり、何ClassLoaderを使用するかを知っている)ことを理解していEventManagerます。しかし、Entityインスタンスがシリアライゼーション メカニズムによって渡されると、 がスローされClassNotFoundExceptionます。を使用するように手動で設定する必要がありClassLoaderます ( Event.class.getClassLoader())。

JVM は、Eventクラスが何であるか、またはすでにロードしている場合にそれをロードする方法を認識していないのはなぜですか?

4

2 に答える 2

2

実際、JVM はこれを「魔法のように」把握しません。これはすべて、使用する環境によって異なるシステム クラス ローダーに基づいています。次に、各スレッドには、これから自動的に派生するコンテキスト ClassLoader があります。

Thread.setContextClassLoaderを使用して変更できるコンテキスト ClassLoader

シリアル化コードが、コンテキスト ClassLoader から見えないクラスを解決できる必要がある場合は、これを設定する必要があります。

于 2012-07-16T13:57:52.973 に答える
1

インスタンスを作成しただけでEventManagerは、JVM にそれをロードする方法が示されませんでした。実際、ここでは JVM と話しているわけではありません。特定の 1 つのクラスローダと通信していて、デシリアライズ時にその同じクラスローダが担当していない場合、エラーが発生する可能性があります。そのため、問題は、どのクラスローダがどの時点で担当しているかということです。

于 2012-07-16T13:58:12.253 に答える