【发布时间】:2019-01-29 17:35:18
【问题描述】:
请看下面的程序:-
class Main {
public static void main(String[] args) {
System.out.println(Boolean.TRUE == new Main().getBoolean());
}
public Boolean getBoolean() {
return true;
}
}
如果我检查 Java 助记符,我会得到:-
Compiled from "Main.java"
class com.testing.Main {
com.testing.Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: getstatic #3 // Field java/lang/Boolean.TRUE:Ljava/lang/Boolean;
6: new #4 // class com/testing/Main
9: dup
10: invokespecial #5 // Method "<init>":()V
13: invokevirtual #6 // Method getBoolean:()Ljava/lang/Boolean;
16: if_acmpne 23
19: iconst_1
20: goto 24
23: iconst_0
24: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V
27: return
public java.lang.Boolean getBoolean();
Code:
0: iconst_1
1: invokestatic #8 // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
4: areturn
}
因此,在 Java Mnemonics 中:
线号最后一个方法的0和1,即getBoolean() method,
我们看到自动装箱发生,即iconst_1 即int 1(此处表示“真”)(在第 0 行)被传递给 Boolean.valueOf() 方法(在第 1 行)。
而Java.Lang中的Boolean.valueOf(boolean b)方法,则返回一个常量Boolean.TRUE或Boolean.FALSE。
因此,== 检查应该始终正常工作,在程序 main 方法中,
或在 Java Mnemonics 中:第 16 行。
但在某些环境中,我看到这返回错误。
怎么可能?
编辑:在这里,在我的例子中,准确地说:Hibernate 从 数据库并设置为布尔字段。这个布尔字段有一个吸气剂, 这是我上面程序中的
getBoolean()。
【问题讨论】:
-
你的代码运行在什么样的环境中?是否涉及多个类加载器?
-
根据 javadoc
Boolean.valueOf()返回Boolean.TRUE或Boolean.FALSE。因此,这导致false不会发生,除非您的 jvm 实现中存在错误或真正损坏的类加载器层次结构。 (给你false的Boolean更有可能是刚刚用new Boolean(boolean)创建的) -
@k5_ 我更担心布尔值不会以某种方式被保留,因此对象比较会接管。
-
添加,布尔值,即从方法中获取的,正在从 MySQL 表中的 BIT 列中获取。特定 SQL 类型 BIT 的 Java 类型是 java.lang.Boolean。 Hibernate 正在获取此数据。
-
那么它可能是一个Hibernate错误(即Hibernate不使用@k5_所说的常量),但最好不要使用
==来比较对象首先。
标签: java hibernate boolean core boolean-expression