尝试使用反射修改String值时JVM崩溃

时间:2010-12-06 19:15:14

标签: reflection string jvm-crash

这是我的第一个问题,我希望不要犯任何可怕的错误。 假设没有SecurityManager阻止我这样做:

public static void main(String[] args) {
    String str = "1";
    System.out.println("str value before invoke fillStringValueWithX method: " + str);
    fillStringValueWithX(str);
    System.out.println("str value before invoke fillStringValueWithX method: " + str);
}

private static void fillStringValueWithX(String str) {
    if (str != null) {
        try {
        Field fieldValue = String.class.getDeclaredField("value");
        fieldValue.setAccessible(true);
        char[] charValue = (char[]) fieldValue.get(str);
        Arrays.fill(charValue, 'x');
        fieldValue.setAccessible(false);
        } catch (Exception e) {}
    }
}

如果字符串的大小为1(上面的示例)JVM崩溃(崩溃转储显示EXCEPTION_ACCESS_VIOLATION错误),但是如果字符串的大小大于1,则此代码段适用于我。

注意:我认为通过反射设置字段值的适当用法是使用valueField.set(obj, value)字段方法,但我想知道JVM崩溃的原因......

由于

2 个答案:

答案 0 :(得分:3)

病人:医生,医生,当我这样做时疼痛(用锤子敲打手臂)。

医生:那不要那样做。

你真的不应该试图弄乱字符串的内容。字符串被设计为不可变的。现在我敢说这是一个JVM错误,它崩溃如此剧烈(它不在我的盒子上,顺便说一下 - 如果你告诉我们你正在使用哪个操作系统和JVM版本会很有用)但简单的答案是不要试图退回到系统的后面。

答案 1 :(得分:0)

它看起来像"1"的字符数组和许多其他实习字符串(例如"true""false""root""class"等)无法在Windows JVM中更改。即您无法为数组元素分配新值。但是您可以为该String对象分配新数组。 Example