如何让String类对象内容发生变化

在学习String类的时候会学到String对象是常量,创建之后内容不可变。如果我非要让它变化呢?

首先从String类的实现上看为什么说String对象不可变。通过查看String源代码可以看到以下代码:

//……
//The value is used for character storage.
private final char value[];
//建议写法是char[] value,String类中的写法是C/C++语言的风格。
//……
  1. String类的底层实现是用一个char数组存储内容,只能在构造方法中对其进行赋值,且构造方法的方法执行过程中都会重新创建数组。创建的时候想直接获取char[] value的值行不通。
  2. 由于该属性被final修饰,因此一旦初始化完成,就不能再指向别的地址。String对象创建后,你没办法让它再指向别的地址了。
  3. 最后String类并没有提供获取value属性值的公共方法,你不能对数组里储存的内容做修改了。

上述种种限制导致String类创建完成后内容就不能再发生变化。

但是如果我们能够获取到String类实例中的value属性的值,就可以使用直接操作数组的方式修改里面的内容了反射恰好能做到这一点,下面直接上代码。

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

        String text = "测试一下";
        System.out.println(text);

        //获取到String类中对应成员变量value的Field对象
        Field fieldValue = text.getClass().getDeclaredField("value");
        //将该成员属性设置为可访问
        fieldValue.setAccessible(true);
        //获取实例text中指向实际存储文字内容的char[]的引用
        char[] value =(char[]) characterStorage.get(text);
        //给value重新赋值,这样就改变了String类对象的值了
        value[0] = 'a';
        value[3] = '哈';

        System.out.println(text);
}

程序运行的输出结果为:
测试一下
a试一哈

posted @ 2022-04-04 10:34  取一个中二的名字  阅读(79)  评论(0)    收藏  举报