使用reflection更改布尔字符串值不起作用

我正在尝试Javareflection和内联字符串,并得出结果,我觉得令人困惑。

import java.lang.reflect.Field; public class HappyDebugging { public static void main(String[] args) throws Exception { defineTrueFalse(); System.out.println("true is " + true); // why is it "true is true"? System.out.println("false is " + false); System.out.println(true); System.out.println(false); System.out.println("true"); System.out.println("false"); System.out.println("true is " + Boolean.valueOf(true)); System.out.println("false is " + Boolean.valueOf(false)); System.out.println("true is " + Boolean.valueOf("true")); System.out.println("false is " + Boolean.valueOf("false")); } static void defineTrueFalse() throws Exception{ Field field = String.class.getDeclaredField("value"); field.setAccessible(true); field.set("true", new char[] {'f', 'a', 'l', 's', 'e'}); field.set("false", new char[] {'t', 'r', 'u', 'e'}); field = String.class.getDeclaredField("offset"); field.setAccessible(true); field.setInt("true", 0); field.setInt("false", 0); field = String.class.getDeclaredField("count"); field.setAccessible(true); field.setInt("true", 5); field.setInt("false", 4); } } 

为什么输出中的前两行是

 true is true false is false 

我希望他们是

 true is false false is true 

请注意,不同平台的输出会有所不同。

在我的编译器中,这两行被编译为使用实际的字符串"true is true""false is false" (即没有运行时连接),所以你的反思邪恶来得太晚了。 你说输出取决于平台,所以我猜一些编译器不能执行这种优化。

这似乎工作….

 String.valueOf(BooleanValue) 

defineTrueFalse没有效果所以"true is " + true被视为"true is " + Boolean.toString(true)这就是为什么它给你的结果为true is true

答案很简单。 这两行

  System.out.println("true is " + true); System.out.println("false is " + false); 

请执行下列操作。 1.将boolean“true”类型的简单值转换为String,从而产生字符串“true”。 同样的“假”,就是这样

因为你正在搞乱实习的字符串文字的内容(以某种方式将你的灵魂诅咒到地狱的第九圈中的永恒痛苦,我可能会补充),但你的前两行连接布尔文字,而不是字符串文字。 defineTrueFalse()中的任何内容都不会对布尔值truefalse产生任何影响(与字符串文字"true""false"相反)。

请注意,不同平台的输出会有所不同。

但不是前两行,我打赌。 对于可能与字符串相关的东西,因为行为取决于字符串文字的实习,我不认为这是由规范保证的(因此,地狱的第九个圆圈)。