3

カスタム ClassLoader を使用してクラスがロードされた場合は、もちろん、結果オブジェクトの「getClassLoader()」メソッドを呼び出すと、デフォルトでカスタム ClassLoader が返されます。

私の質問は、同じオブジェクトがシリアライズされ、ネットワーク経由で送信されてからデシリアライズされた場合にどうなるかです。Deserialized クラスで「getClassLoader()」を呼び出すと、カスタム ClassLoader が返されますか?

4

2 に答える 2

2

私の質問は、同じオブジェクトがシリアライズされ、ネットワーク経由で送信されてからデシリアライズされた場合にどうなるかです。Deserialized クラスで「getClassLoader()」を呼び出すと、カスタム ClassLoader が返されますか?

クラスローダーはシリアル化されていません。getClassLoader() は、ObjectInputStream が使用しているクラス ローダーを提供します。


ObjectInputStream.resolveClassから

ObjectInputStream でのこのメソッドのデフォルトの実装は、呼び出しの結果を返します

 Class.forName(desc.getName(), false, loader)

ここで、loader は次のように決定されます。 現在のスレッドのスタックに、宣言クラスがユーザー定義のクラス ローダーによって定義された (およびリフレクション呼び出しを実装するために生成されたものではない) メソッドがある場合、loader は、最も近いクラス ローダーに対応するクラス ローダーです。現在実行中のフレームに対するそのようなメソッド。それ以外の場合、loader は null です

于 2012-10-02T11:36:43.620 に答える
1

いいえ。クラスのインスタンスを実際のクラス自体と混同しています。シリアライズされたオブジェクトがデシリアライズされる前に、クラスをロードする必要があります。

于 2012-10-02T11:36:18.680 に答える