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的值有什么意义呢,除了真的很危险暂时还没想出来。。。
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的值有什么意义呢,除了真的很危险暂时还没想出来。。。
相关文章推荐
- java反射-修改String常量
- Java反射-修改String常量
- Java中,利用反射机制修改定义出来的String对象本身。
- JAVA反射修改常量,以及其局限
- Java反射学习-使用反射修改一个类中的所有String类型的成员变量的值
- JAVA反射修改常量,以及其局限
- JAVA反射修改常量,以及其局限(修改private final限制)
- Java中String不可变性以及通过反射进行修改
- Java 反射中的getDeclaredMethod(String,Class<?>[])与NoSuchMethodExecption
- Java常量字符串String理解
- JAVA String对象和字符串常量的关系解析
- JAVA String对象和字符串常量的关系解析
- Java中的String为什么是常量字符串(即不可变)
- Java基础笔记 – 通过反射机制修改类中的私有属性的值
- java 张孝祥(12) 通过反射将String写入Integer的数组中。
- Java复习3.变量.常量.String.
- java 反射机制修改private final变量
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- java基础知识(五) 字符串定义(String)与字符串的修改(StringBuffer)
- java反射 String数组