String类真的不可变吗?

来源:互联网 发布:python视频教程哪家好 编辑:程序博客网 时间:2024/05/16 19:07
String对象真的不可变吗?
从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。那么在这几个成员中, value比较特殊,因为他是一个引用变量,而不是真正的对象。value是final修饰的,也就是说final不能再指向其他数组对象,那么我能改变value指向的数组吗? 比如将数组中的某个位置上的字符变为下划线“_”。 至少在我们自己写的普通代码中不能够做到,因为我们根本不能够访问到这个value引用,更不能通过这个引用去修改数组。

那么用什么方式可以访问私有成员呢? 没错,用反射, 可以反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。下面是实例代码:

public static void testReflection() throws Exception {//创建字符串"Hello World", 并赋给引用sString s = "Hello World"; System.out.println("s = " + s);//Hello World//获取String类中的value字段Field valueFieldOfString = String.class.getDeclaredField("value");//改变value属性的访问权限valueFieldOfString.setAccessible(true);//获取s对象上的value属性的值char[] value = (char[]) valueFieldOfString.get(s);//改变value所引用的数组中的第5个字符value[5] = '_';System.out.println("s = " + s);  //Hello_World}


0 0