2017-01-13 1 views
0

今日奇妙なものが見つかりました。 は私が保護され、最終的なブール型のフィールドがあります:あなたが見ることができるようにオブジェクトがリフレクションによって作成されたときに最後のブール値フィールドが初期化されない

protected final boolean active = true; 

を、私は、オブジェクトがインスタンス化された後、このフィールドがTRUE値で初期化することを期待しています。これはデータベースモデルクラスです。 mybatis 3.1.1を使用してデータベースからデータを読み込みます。 mybatis SqlSession.selectOne()を使用してdbを呼び出すと、何が表示されるのですか?アクティブな== falseのオブジェクトが返されます。しかし、私はSQLクエリでこのフィールドを変更しません。 mybatisコードを掘り下げて、DefaultObjectFactory.java#create(Class<T>, List<Class<?>>, List<Object>)にオブジェクトがインスタンス化され、この最終的な「アクティブ」フィールドがFALSEに等しいことがわかりました。 まあ、私は完全に混乱していて、それに関する情報を見つけることができません。 誰かがここで何が起こっているのか説明してもらえますか?コンストラクタロジックが終了した後に最終的なフィールドを初期化する必要があると私は思っていました。

+0

通常の反射はコンストラクタをバイパスできないため、この場合は不可能です。逆直列化は可能ですが、これは、オブジェクトが格納されたときにフィールドがすでに「false」であったことを意味します。一般的に、この種の 'final'インスタンスフィールドにはほとんど意味がありません。これはコンパイル時の定数なので、通常のコードではフィールドに実際に何が格納されているかが分かりません。 – Holger

+0

私は 'DefaultObjectFactory'を調べました。それは' java.lang.reflect.Constructor'を直接使うので、初期化をバイパスすることはできません。問題は、「アクティブ」が「偽」であるという結論にどのようにきたかということです。 – Holger

+0

@Holger、私はデバッガを調べました。インスタンス化されたオブジェクトは、SOAPを介してクライアントに送信され、クライアントもそれを偽と見なします。 –

答えて

0

@Holgerのおかげで!

私はクラスを使いこなしました。最終的なフィールドの初期化は期待通りに機能します。

関連する問題