奇怪的Java代码

奇怪的Java代码,java,reflection,Java,Reflection,我找到了以下代码片段: 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");

我找到了以下代码片段:

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);
        }
    }
}
根据我的理解,输出应为
内部静态bolck
,但输出为
内部stat
,与
内部main
的字符长度相同
*如果我增加内部主管道的长度,则输出长度也会增加。
谁能解释一下吗?
我对反射没有太多的知识。

在我的JDK上,
String
还有一个
count
成员,需要更新以反映新的长度

还有一个
offset
字段,它可能需要更新,也可能不需要更新(可能不需要更新)

最后,还有一个
散列
字段,在您更改
后,该字段将不再正确


由于此代码依赖于
String
的特定实现的未记录细节,因此它非常脆弱且高度不可移植。例如(帽尖@assylias)。如果要从7u5升级到7u6,代码的行为会突然发生变化。

代码对字符串类的实际实现进行了假设,例如,该类有一个名为“value”的字段

由于String类的内部状态不是API或语言规范的一部分,因此不同供应商的VM之间,甚至同一供应商的不同VM版本之间的实际实现将有所不同。

“Inner main”
包含值[]中的11个字符(值[]是String类中的私有字段)
字符串
值[]
在您定义字符串
的第一个位置初始化,即“在main内部”

现在您正在使用反射更改字符串中的私有实例变量
value[]
的值,然后它必须只适合静态bolck中字符串
中的11个字符

,当您更改“Inside main”时,您可以为我更改
value.get()
它在静态bolck中打印的字符串
。您使用的是哪个版本的JDK/JRE?IBM 32位SDK for Windows,Java Technology Edition,version 6I我将重复NPE的问题,因为我也很渴望——无论如何,您将如何处理这个问题?我找到了代码片段。我不会用这个做任何事。这只是为了我的知识。请你发表评论,这样我可以改进我的问题。我认为JDK 7u6中的计数消失了(对于Oracle JDK)。因此,在7更新6+上,它将工作,但在之前,它的行为将与问题中的一样。我找到了代码片段。我不会用这个做任何事。这只是为了我的知识,它为我打印“内部统计”,这与@NPE上面所说的联系在一起,这大概意味着OP也在使用一个版本,我的“内部统计”计数为1.6
"Inside static bolck"