我正在尝试使用Java反射和内联字符串,并得出结果,我觉得很困惑。
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
请注意,不同平台的输出会有所不同。
答案 0 :(得分:17)
这似乎有效......
String.valueOf(BooleanValue)
答案 1 :(得分:6)
在我的编译器中,这两行被编译为使用实际的字符串"true is true"
和"false is false"
(也就是说,没有运行时连接),所以你的反思邪恶来得太晚了。你说输出取决于平台,所以我猜一些编译器不能执行这种优化。
答案 2 :(得分:4)
defineTrueFalse
无效,因此"true is " + true
被视为"true is " + Boolean.toString(true)
,这就是为什么它会将结果显示为true is true
答案 3 :(得分:3)
答案很简单。这两行
System.out.println("true is " + true);
System.out.println("false is " + false);
执行以下操作。 1.将boolean“true”类型的简单值转换为String,这将导致字符串“true”。同样的“假”,就是它
答案 4 :(得分:2)
因为你正在搞乱实习的字符串文字的内容(以某种方式将你的灵魂诅咒到地狱的第九圈中的永恒痛苦,我可能会补充),但你的前两行连接布尔文字,而不是字符串文字。 defineTrueFalse()
中的任何内容都不会对布尔值true
和false
产生任何影响(与字符串文字"true"
和"false"
相对)。
请注意,不同平台的输出会有所不同。
但不是前两行,我打赌。对于可能与字符串相关的东西,因为行为取决于字符串文字的实习,我不认为这是由规范保证的(因此,地狱的第九个圆圈)。