2

私はこのコードをオンラインで見つけました。ここでは、クラスの外にプライベートコンストラクターを持つクラスをインスタンス化しています。これがどのように機能するのか理解できません。以前に読んだことから、クラスでプライベートコンストラクターを使用して、クラス外でインスタンス化できないようにしています。

public final class A extends B {
  private A(Something, Something)
  {
    //Something
  }

  public void someMethods()
  {
    //Something
  }
}

public final class B {
  private A a;
  public void someMethod()
  {
    final ObjectInputStream objectInputStream = new ObjectInputStream(
                            new ByteArrayInputStream(buffer.toByteArray()));
    a = (A) objectInputStream.readObject();
    objectInputStream.close();

    a.someMethods();
  }
} 

ここで何が起こっているのか正確に理解したいだけですか?読み上げてみましたObjectInputStreamが、何も得られませんでした。

4

3 に答える 3

5

コードはシリアライゼーションによってオブジェクトをインスタンス化し、そのオブジェクトをクラス A にキャストしているように見えます。クラス A コンストラクターが呼び出された場所はどこにもありません。

于 2012-08-13T16:46:29.630 に答える
2

オブジェクトは構築されていないが逆シリアル化されているため、コンストラクターが呼び出されることはありません。したがって、アクセス修飾子はここでは効果がありません。

シリアル化は基本的に、ヒープのコンテンツの一部をストリーム/ファイルなどに書き込むプロセスです。オブジェクトを構築すると、ヒープ上に新しいオブジェクトが作成され、コンストラクターが呼び出されて初期化されます。その後、シリアル化中に保持される状態になります。したがって、逆シリアル化されたときにそのオブジェクトを再度初期化する必要はありません。これは、ヒープのその部分をストリーム/ファイルからメモリに再度読み取るようなものです。

それ以外に、リフレクションを使用してアクセス修飾子を回避する方法があることに注意してください。

于 2012-08-13T16:49:25.133 に答える
1

これはシリアライゼーションに関係しており、デシリアライズすると、コンストラクターは実際には呼び出されません。

于 2012-08-13T16:45:03.027 に答える