String类真的不可变吗?
来源:互联网 发布:python视频教程哪家好 编辑:程序博客网 时间:2024/05/16 19:07
String对象真的不可变吗?
从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。那么在这几个成员中, value比较特殊,因为他是一个引用变量,而不是真正的对象。value是final修饰的,也就是说final不能再指向其他数组对象,那么我能改变value指向的数组吗? 比如将数组中的某个位置上的字符变为下划线“_”。 至少在我们自己写的普通代码中不能够做到,因为我们根本不能够访问到这个value引用,更不能通过这个引用去修改数组。
从上文可知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
- String类真的不可变吗?
- Java String 真的是不可变的吗
- 不可变的String类
- 不可变的String
- String的不可变
- string 不可变类
- 为什么String类是不可变的
- 为什么String类是不可变的?
- 为什么String类是不可变的?
- 为什么String类是不可变的?
- 为什么String类是不可变的?
- 为什么String类是不可变的?
- 为什么String类是不可变的?
- 为什么String类是不可变的
- 为什么String类是不可变的?
- 为什么String类是不可变的?
- 为什么String类是不可变的
- 为什么String类是不可变的?
- 关于最大流最小割的一点感悟
- js判断元素是否隐藏的几种方法
- Python 推导式
- Ubuntu package system is broken
- 迷宫 图形库 开发
- String类真的不可变吗?
- MSF自动化浏览器攻击与后门安装
- Suggestion: use tools:overrideLibrary="android.support.v4" to force usage
- C语言-计算某日是该年的第几天
- 231. Power of Two
- HashMap和HashTable 的区别
- 将字符串修改成数组,这是生成的字符型坐标,转换成json格式
- 含有百度地图的签名包,无法正常显示地图
- 5 个最好的 Vim 速查卡 (Cheat Sheet)