gpt4 book ai didi

java - 奇怪的Java代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:49 24 4
gpt4 key购买 nike

我找到了下面的代码片段:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com