gpt4 book ai didi

如果尝试使用反射将值设置为 String 类的 value[] 字段,则 Java 6 和 Java 7 会产生不同的结果

转载 作者:行者123 更新时间:2023-11-30 06:26:16 26 4
gpt4 key购买 nike

以下代码尝试使用 Java 7 为 String 类的 private final char value[] 字段设置一个值。

package test;

import java.lang.reflect.Field;

public final class Test
{
static
{
try
{
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set("Hello World", value.get("1234567890"));
}
catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e)
{
System.out.println(e.toString());
}
}

public static void main(String[] args)
{
System.out.println("Hello World");
}
}

它在控制台上静静地显示 1234567890 并且毫无疑问。


当我尝试像下面这样使用 Java 6 做同样的事情时,

package test;

import java.lang.reflect.Field;

public final class Test
{
static
{
try
{
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
value.set("Hello World", value.get("1234567890"));
}
catch (IllegalArgumentException e)
{
System.out.println(e.toString());
}
catch (IllegalAccessException e)
{
System.out.println(e.toString());
}
catch (NoSuchFieldException e)
{
System.out.println(e.toString());
}
catch (SecurityException e)
{
System.out.println(e.toString());
}
}
public static void main(String[] args)
{
System.out.println("Hello World");
}
}

它会引发以下异常。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException

value.get("1234567890") 的长度在这个语句 value.set("Hello World", value.get("1234567890")); 大于或等于字符串 Hello World

例如,

如果下面的语句(如前面的代码片段)

value.set("Hello World", value.get("1234567890"));

被下面这样的东西代替

value.set("Hello World", value.get("12345678901"));

那么,当 set() 方法比第一种少?

顺便说一句,我可以理解以这种方式处理带有反射的私有(private)字段是完全不推荐的,而且是最糟糕的。

最佳答案

So why doesn't this work with Java 6 (or might be lower, I didn't try) when the length of the second parameter of the set() method is less than the first one?

在 Java 6 中,您设法将 value 字符数组设置为新引用 - 但您没有更改指定部分的 other 字段字符串引用的 char[]

我不记得确切的字段名称,但它是这样的:

char[] value;
int offset;
int count;

因此对于“覆盖”整个字符数组的字符串,offset 将为 0 而 count 将为 value.length。现在,如果您将 value 替换为 更短 char[],但不更改 count,则 offset + count 超出了数组的末尾...它超出了数组的范围。这样做是为了像 substring 这样的操作不需要复制字符数据 - 它们只是创建一个新对象,该对象引用现有数组,具有不同的偏移量/计数值。

在 Java 7 从 update 5 开始,字符串没有这个偏移量/计数的概念;相反,每个字符串都有自己的字符数组,并且开始和结束是隐式的。我怀疑这就是它适用于 Java 7 的原因。

关于如果尝试使用反射将值设置为 String 类的 value[] 字段,则 Java 6 和 Java 7 会产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14552041/

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