boolean.false不等于false

yftpprvb  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(525)

所以我在玩 java.lang.reflect 然后试着做这样的东西。这是我的问题(可能是一个bug):
将字段设置为true的方法的代码:

private static void setFinalStatic(Field field, Object newValue) throws Exception
{
    field.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, newValue);
}

我打印的代码:

setFinalStatic(Boolean.class.getField("FALSE"), true);
System.out.format("%s\n", false);         //prints true
System.out.println(false);                //prints false
System.out.format("%s\n", Boolean.FALSE); //prints true
System.out.println(Boolean.FALSE);        //prints true
System.out.println(Boolean.FALSE == false);        //prints false
System.out.format("%s\n", Boolean.FALSE == false); //prints true

当你使用 System.out.format("%s", false) 它会像预期的那样返回“true”
但是当你使用 System.out.println(false) 它打印“假”。
当我尝试这个的时候 System.out.println(Boolean.FALSE == false) 上面印着“假”。
你能解释一下吗?

xpcnnkqh

xpcnnkqh1#

当您使用system.out.println(false)时,它会打印“false”。
此布尔值从不自动装箱,因此通过反射所做的更改不相关。
以下是调用堆栈:

PrintStream::println(boolean x)
PrintStream::print(boolean b)
String::valueOf(boolean b)
``` `String.valueOf(boolean)` 实现方式如下:

public static String valueOf(boolean b) {
return b ? "true" : "false";
}

因此,您更改了 Package 器类使用的常量这一事实并没有什么区别。我们从不使用 Package 器类。
当我尝试这个system.out.println(boolean.false==false)时,它显示“false”。 `Boolean.FALSE` 自动取消绑定到基元 `true` .  `true == false` 是假的。
r6hnlfcb

r6hnlfcb2#

没有虫子, Boolean.FALSE 您重写的用于自动装箱,因为 boolean 自动装箱是通过编译器静默调用 Boolean.valueOf() 具有以下正文的方法:

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

在你的例子中 boolean 传递给方法的参数使用 Object 类型,例如。 System.out.format(String, Object...) 会自动装箱。他们会受到你的反射变化和 false 将成为 true .
否则方法使用 boolean 原语不会受到影响。 System.out.println(boolean) 以及 false 会留下来的 false .
您的示例中最有趣的两行是: System.out.println(Boolean.FALSE == false) 编译器正在取消装箱 Boolean.FALSE 通过呼叫 Boolean.FALSE.booleanValue() 因为你的反射覆盖返回 true . 自 true == false 你得到了吗 false . 这可以通过在 Boolean.booleanValue() . System.out.format("%s\n", Boolean.FALSE == false) 尽管你得到了 false 根据上面的比较,它将自动装箱到 Boolean 匹配 System.out.format(String, Object...) 方法签名。这将输出 true 因为你的反射覆盖。

相关问题