您的位置:首页 > 编程语言 > Java开发

Java反射-修改String常量

2016-08-04 10:34 459 查看
我们都知道,String是java中的字符串,是不可变的,对String类的任何改变,都是返回一个新的String类对象。但如果非要改变它也不是不可以,利用反射就可以做到。

import java.lang.reflect.Field;

public class ReflectString {

public static void main(String[] args) {
String s1 = "abcd";
String s2 = "abcd";
String s3 = new String("abcd");
String s4 = new String(s1);
System.out.println("s1==s2:" + (s1 == s2));
System.out.println("s1==s3:" + (s1 == s3));
System.out.println("s3==s4:" + (s3 == s4));
try {
Field f = String.class.getDeclaredField("value");
System.out.print("\nAccessible: " + f.isAccessible());
f.setAccessible(true);
System.out.println(" -> " + f.isAccessible());
char[] v = (char[]) f.get(s1);// 获取S1的内部value数组
System.out.print("\nvalue:");
System.out.println(v);
v[0] = 'x';// 修改数组
v = new char[1];// 目测因为是get到的是引用的复制,这个引用改变不影响原引用
v[0] = 'y';
System.out.print("value:");
System.out.println(v);

} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("\ns1:" + s1 + "\ns2:" + s2 + "\ns3:" + s3 + "\ns4:" + s4);
System.out.println("\ns1==s2:" + (s1 == s2));
System.out.println("s1==s3:" + (s1 == s3));
System.out.println("s3==s4:" + (s3 == s4));
}
}输出:
s1==s2:true
s1==s3:false
s3==s4:false

Accessible: false -> true

value:abcd
value:y

s1:xbcd
s2:xbcd
s3:xbcd
s4:xbcd

s1==s2:true
s1==s3:false
s3==s4:false
可见,一旦修改了一个String常量的值,所有字符串和它相等的变量的值都会改变,据说是因为它们在底层都是用的同一份数据,没验证。。。

嗯,强行改人家String的值有什么意义呢,除了真的很危险暂时还没想出来。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: