HiberSAP プロジェクトのコード( BooleanConverter Linenumber 75)で非常に奇妙な動作に気付きました。
問題は、ブール値が「X」に変換されないことです。コードをデバッグし、ブール式を調べましたjavaValue == Boolean.TRUE
。Boolean.TRUE
javaValueの ID は 36 で、Boolean.TRUE の ID は 33 であるため、この式は false と解釈されます(ID は Eclipse IDE の変数ビューに表示されます)。Boolean のすべてのインスタンスを調べることもできます。実際、java.lang.Boolean のインスタンスが 4 つあります。
誰かが私になぜこれが起こっているのか説明してもらえますか.
編集:
わかりました、私の質問は十分に正確ではないと思います。変換する必要があるフィールドはブール値であり、 java.lang.Booleanではありません。これは Classloader Fault である必要があります。私の場合、ブール値からブール値への唯一の変換は JVM によって行われます。すべてのオブジェクト比較で .equals() を使用する必要があることはわかっています (そしてバグを埋めます) が、この場合はそのまま機能するはずです。次のコードを参照してください。
public static void main(String[] args) {
for(int i = 0; i < 1000; i++){
print(true);
}
}
public static void print(Object value) {
System.out.println(value);
}
これにより、1000 個の java.lang.Boolean インスタンスが作成されることはありません。これは常にjava.lang.Boolean.TRUE を使用する必要があります! そして、これは私が理解できなかったコードの奇妙な動作です。
これは、Hibersap によって行われるリフレクションの副作用でしょうか? しかし、これがそのような行動の理由であってはならないと思います。
どうか、理解したいだけです。