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)
请注意,输出在不同平台上有所不同.
在我的编译器,这两条线被编译使用实际的字符串"true is true"和"false is false"(即,没有发生运行时间串联),所以你的反射邪恶来得太迟了.你说输出取决于平台,所以我猜一些编译器不能执行这种优化.
| 归档时间: |
|
| 查看次数: |
25177 次 |
| 最近记录: |