以下代码尝试使用 Java 7private final char value[]
为 String 类的字段设置一个值。
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");
}
}
它会导致引发以下异常。
线程“主”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"));
那么,当方法的第二个参数的长度小于第一个参数时,为什么这不适用于Java 6(或者可能更低,我没有尝试过) ?set()
顺便说一句,我可以理解,根本不建议以这种方式处理具有反射的私有字段,而且是最糟糕的。