いくつかの Java オブジェクトをシリアライズしようとしています。そのために、デフォルトのコンストラクターを持たない可能性のある未知のクラスを (私にとって) インスタンス化したいと考えています。他のコンストラクターを呼び出す方法がわからないため (パラメーターはわかりますが、あまり役に立ちません)、クラスの「空の」インスタンスを作成したいと思います。
その後、リフレクションを使用して属性を設定します。
これはどういうわけか可能ですか?
いくつかの Java オブジェクトをシリアライズしようとしています。そのために、デフォルトのコンストラクターを持たない可能性のある未知のクラスを (私にとって) インスタンス化したいと考えています。他のコンストラクターを呼び出す方法がわからないため (パラメーターはわかりますが、あまり役に立ちません)、クラスの「空の」インスタンスを作成したいと思います。
その後、リフレクションを使用して属性を設定します。
これはどういうわけか可能ですか?
Unsafe クラスを使用して可能です。さらに、この sun.x クラスを使用して「constructorForSerialization」を取得する可能性があります。
ReflectionFactory.getReflectionFactory().
newConstructorForSerialization(clazz, c);
要するに、いいえ。
ただし、コンストラクターはさまざまな方法で呼び出すことができます。これは、「デフォルト」のコンストラクター、コードで実際に表現されていないコンストラクター、または逆シリアル化などの他の項目を実行するときに内部にあるコンストラクターである可能性があります。
コンストラクターは参照を返します。これは、いくつかの重要な内部ステップで構成されています。
<init>(...)
メソッドが呼び出されます (プログラミングの側面から、これは人々がコンストラクター メソッドと考えるものであり、通常は書かれていpublic Object(...) { ... }
ます)。したがって、構築は単なるコードの呼び出しではなく、オブジェクト作成の実装です。さまざまな方法でメソッドの提供を回避できますがinit
、構築に必要な内部操作は実際には省略できません。もしそうなら、オブジェクト参照が不足しています。