我找到了下面的代码片段:
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
System.out.println("Inside main");
}
static {
try {
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set("Inside main", value.get("Inside static bolck"));
} catch (Exception e) {
throw new AssertionError(e);
}
}
}
根据我的理解,输出应该是 Inside static bolck
但输出是 Inside stat
,与 Inside main
的字符长度相同.
*如果我增加 Inside main 的长度,输出长度也会增加。
有人可以解释一下吗?
我对反射知之甚少。
最佳答案
在我的 JDK 上,String
也有一个 count
成员,需要对其进行更新以反射(reflect)新的长度。
还有一个 offset
字段,它可能需要也可能不需要更新(在这种情况下可能不需要)。
最后,有一个 hash
字段,在您更改 value
后,该字段将不再正确。
由于此代码依赖于 String
的特定实现的未记录细节,因此它非常脆弱且高度不可移植。例如(帽子提示@assylias),Oracle have removed the count
and offset
fields in JDK 7u6 .如果您要从 7u5 升级到 7u6,您的代码的行为会突然发生变化。
关于java - 奇怪的Java代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15432873/