我找到了这个线程这个 Java 代码片段是如何工作的?(字符串池和反射)谈论使用反射改变字符串的值。
我完全理解这个技巧,但稍作改动,它就不再像预期的那样工作了。
你能解释一下这段代码发生了什么吗?
import java.lang.reflect.Field;
public class Parent {
static String hello = "Hello";
static {
try {
Field value = hello.getClass().getDeclaredField("value");
value.setAccessible(true);
value.set(hello, "Bye bye".toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean check(String s){
System.out.println(s + " " + "Hello");
return s.equals("Hello");
}
}
.
public class Child extends Parent{
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
System.out.println(check("Hello"));
}
}
上面的代码打印:
你好再见
假
为什么字符串litteral“Hello”在Parent类中引用“Bye bye”但在Child类中引用“Hello”?