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

Vla*_*aev 3 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么输出中的前两行是

true is true
false is false
Run Code Online (Sandbox Code Playgroud)

我希望他们是

true is false
false is true
Run Code Online (Sandbox Code Playgroud)

请注意,输出在不同平台上有所不同.

小智 17

这似乎工作....

String.valueOf(BooleanValue)
Run Code Online (Sandbox Code Playgroud)


rua*_*akh 6

在我的编译器,这两条线被编译使用实际的字符串"true is true""false is false"(即,没有发生运行时间串联),所以你的反射邪恶来得太迟了.你说输出取决于平台,所以我猜一些编译器不能执行这种优化.