2

いくつかの Java オブジェクトをシリアライズしようとしています。そのために、デフォルトのコンストラクターを持たない可能性のある未知のクラスを (私にとって) インスタンス化したいと考えています。他のコンストラクターを呼び出す方法がわからないため (パラメーターはわかりますが、あまり役に立ちません)、クラスの「空の」インスタンスを作成したいと思います。

その後、リフレクションを使用して属性を設定します。

これはどういうわけか可能ですか?

4

2 に答える 2

6

Unsafe クラスを使用して可能です。さらに、この sun.x クラスを使用して「constructorForSerialization」を取得する可能性があります。

ReflectionFactory.getReflectionFactory().
    newConstructorForSerialization(clazz, c);
于 2013-11-04T16:32:13.313 に答える
1

要するに、いいえ。

ただし、コンストラクターはさまざまな方法で呼び出すことができます。これは、「デフォルト」のコンストラクター、コードで実際に表現されていないコンストラクター、または逆シリアル化などの他の項目を実行するときに内部にあるコンストラクターである可能性があります。

コンストラクターは参照を返します。これは、いくつかの重要な内部ステップで構成されています。

  1. JVM は、クラスのメンバー データ (およびサポート アイテムへの参照) を保持するために、ヒープにメモリを割り当てる必要があります。
  2. その内部 JVM データ構造のアドレスには、型安全な参照が与えられます。
  3. 適切な<init>(...)メソッドが呼び出されます (プログラミングの側面から、これは人々がコンストラクター メソッドと考えるものであり、通常は書かれていpublic Object(...) { ... }ます)。
  4. 参照は実行コンテキストに返されます。

したがって、構築は単なるコードの呼び出しではなく、オブジェクト作成の実装です。さまざまな方法でメソッドの提供を回避できますがinit、構築に必要な内部操作は実際には省略できません。もしそうなら、オブジェクト参照が不足しています。

于 2013-11-04T15:49:34.673 に答える