所以我在玩 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)
上面印着“假”。
你能解释一下吗?
2条答案
按热度按时间xpcnnkqh1#
当您使用system.out.println(false)时,它会打印“false”。
此布尔值从不自动装箱,因此通过反射所做的更改不相关。
以下是调用堆栈:
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
r6hnlfcb2#
没有虫子,
Boolean.FALSE
您重写的用于自动装箱,因为boolean
自动装箱是通过编译器静默调用Boolean.valueOf()
具有以下正文的方法:在你的例子中
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
因为你的反射覆盖。