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

时间:2012-01-04 14:53:15

标签: java string reflection boolean

我正在尝试使用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

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

5 个答案:

答案 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()中的任何内容都不会对布尔值truefalse产生任何影响(与字符串文字"true""false"相对)。

  

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

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