2

JDK 6.0 のソース コードを読んだとき、これら 2 つのメソッドが ArrayList にあることがわかりました。どちらも非公開であることがわかります。しかし、検索した後、それらのいずれかを呼び出す他のメソッドは見つかりませんでした。ネイティブメソッドも検討しましたが、まだ見つかりませんでした。これら 2 つのメソッドは IO を処理しているように見えますが、呼び出されることはありません。

それで、私の質問は、それらはどのように機能するのですか? プライベート メソッドを呼び出す他の方法はありますか?

/**
 * Save the state of the <tt>ArrayList</tt> instance to a stream (that is, serialize it).
 */
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException;

/**
 * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is, deserialize it).
 */
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException;
4

1 に答える 1

3

これらの 2 つのメソッドは、シリアライズ可能なクラスで使用され、シリアライゼーションをカスタマイズします (別名、デフォルト プロトコルのカスタマイズ)

記事のテキスト:

ただし、奇妙で狡猾な解決策があります。開発者は、シリアライゼーション メカニズムの組み込み機能を使用して、クラス ファイル内に 2 つのメソッドを提供することにより、通常のプロセスを拡張できます。それらの方法は次のとおりです。

  1. private void writeObject(ObjectOutputStream out) は IOException をスローします。
  2. private void readObject(ObjectInputStream in) は、IOException、ClassNotFoundException をスローします。

どちらのメソッドも継承されず、オーバーライドもオーバーロードもされていないことが証明されているため、両方のメソッドがプライベートに宣言されている (そして宣言されている必要がある) ことに注意してください。ここでの秘訣は、対応するメソッド呼び出し中にいずれかのメソッドが宣言されているかどうかを仮想マシンが自動的に確認することです。仮想マシンは、必要なときにいつでもクラスのプライベート メソッドを呼び出すことができますが、他のオブジェクトはできません。

于 2012-08-30T03:00:18.487 に答える