所以我正在玩 java.lang.reflect
东西并尝试制作类似 this 的东西。这是我的问题(可能是一个错误):
将字段设置为 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)
时,它会打印“false”。当我尝试这个 System.out.println(Boolean.FALSE == false)
它打印“false”。
请你解释一下吗?
最佳答案
不存在错误,您覆盖的 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
。
关于java - Boolean.FALSE 不等于 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54517195/