你可能问一个人String是可变的吗?想必他们都会一口同生的说String是不可变的,因为String是final修饰的,而且它底层的是final修饰的char[]数组。
可以看到String源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */
private final char value[];所以说String是不可变得,但是我们忽略了反射,利用反射我们可以改变String的值,话不多说看反射是如何做到的:
public static void main(String[] args) throws Exception { // 创建字符串"Hello World", 并赋给引用s
String s = "Hello World"; //把这个s保存一份用于对比
String temp = s;
System.out.println("s和temp是否相等? " + s.equals(temp));
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
System.out.println("s和temp是否相等? " + s.equals(temp));
}可以发现我们利用反射绕过了私有权限修改了String底层的 char[]数组,我想看过这篇文章的小伙伴你们知道当别人问起String是不是可变的时候该怎么说了吧?
原文出处:https://www.cnblogs.com/keeya/p/9525516.html
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦

