使用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()
中的任何内容都不会对布尔值true
和false
产生任何影响(与字符串文字"true"
和"false"
相反)。
请注意,不同平台的输出会有所不同。
但不是前两行,我打赌。 对于可能与字符串相关的东西,因为行为取决于字符串文字的实习,我不认为这是由规范保证的(因此,地狱的第九个圆圈)。