java中的String类是final,即不可变的,这两天看了一下java的反射,于是就想,能不能通过反射来使String的值改变。
public static void main (String[] args) throws NoSuchFieldException, IllegalAccessException { String s = "我是小明"; System.out.println(s); System.out.println("改变前的hashCode:"+s.hashCode()); Class stringClass = s.getClass(); //获取String的value属性 getDeclaredField方法为获取一个类的指定属性,若该属性不存在会抛出NoSuchFieldException异常 Field valueField = stringClass.getDeclaredField("value"); //因为value的修饰符是private,所以要通过setAccessible方法获取访问权限 valueField.setAccessible(true); char[] chars = {'小','明','是','我'}; //第一个参数是一个Object对象,这里要修改s,所以传入s,第二个参数也是Object类型, // 因为String的value为char数组,故这里传入一个char数组, // 若没取得访问权限则会抛出一个IllegalAccessException安全权限异常 valueField.set(s,chars); System.out.println(s); System.out.println("改变后的hashCode:"+s.hashCode()); }
可以看到两次输出的hashCode值都一样,这就说明String的值被改变了