java – 字符串文字,实习和反思
|
我试图找到第三个解决方案 this question. 我不明白为什么不打印错误. public class MyClass {
public MyClass() {
try {
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
f.set("true",f.get("false"));
} catch (Exception e) {
}
}
public static void main(String[] args) {
MyClass m = new MyClass();
System.out.println(m.equals(m));
}
}
当然,由于字符串的实习,被修改的“真实”实例与PrintStream的打印方法中使用的实例完全相同? public void print(boolean b) {
write(b ? "true" : "false");
}
我失踪了什么 编辑 @yshavit的一个有趣的一点是,如果你添加行 System.out.println(true); 在尝试之前,输出是 true false 解决方法这可以说是一个HotSpot JVM错误.问题在于字符串文字实习机制. >在常量池解析过程中,字符串文字的java.lang.String实例被懒惰地创建. 那么,你的测试发生了什么? > f.set(“true”,f.get(“false”))在MyClass中启动文字“true”的解析. 为什么我认为这是一个错误? JLS §3.10.5和JVMS §5.1要求包含相同字符序列的字符串文字必须指向与java.lang.String相同的实例. 但是,在下面的代码中,具有相同字符序列的两个字符串文字的分辨率会导致不同的实例. public class Test {
static class Inner {
static String trueLiteral = "true";
}
public static void main(String[] args) throws Exception {
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
f.set("true",f.get("false"));
if ("true" == Inner.trueLiteral) {
System.out.println("OK");
} else {
System.out.println("BUG!");
}
}
}
JVM的一个可能的修复是将一个指向StringTable中的原始UTF序列的指针以及java.lang.String对象存储在一起,因此实际进程不会将cpool数据(用户无法访问)与值数组(可通过Reflection进行访问)进行比较. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
