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进行访问)进行比较. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |