如何让String类对象内容发生变化
在学习String类的时候会学到String对象是常量,创建之后内容不可变。如果我非要让它变化呢?
首先从String类的实现上看为什么说String对象不可变。通过查看String源代码可以看到以下代码:
//……
//The value is used for character storage.
private final char value[];
//建议写法是char[] value,String类中的写法是C/C++语言的风格。
//……
- String类的底层实现是用一个char数组存储内容,只能在构造方法中对其进行赋值,且构造方法的方法执行过程中都会重新创建数组。创建的时候想直接获取char[] value的值行不通。
- 由于该属性被final修饰,因此一旦初始化完成,就不能再指向别的地址。String对象创建后,你没办法让它再指向别的地址了。
- 最后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试一哈

浙公网安备 33010602011771号