我们知道java的字符串类型String被设计成不可变的。那么我们还有办法改变它的值吗?
先来看一下,截取自jdk1.8.0_151的java.lang.String类的声明:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
String被设计成final类,即不可继承,同时实现了序列化等接口。
再来看一下,String的成员变量:
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
总共有三个成员变量,出来hash被设置为非final常量,其余全是常量。更重要的是value被设计为final,以维护String的不可变性。
我们利用反射来打破这种不可变性,看如下代码:
package com.modest.cainiao;
import java.lang.reflect.Field;
/**
*
* @author heng.guo
* @date 2018-07-28
*
*/
public class StringImmutable {
public st