java反射-修改String常量
2017-10-24 20:06
337 查看
摘要: 我们都知道,String是java中的字符串,是不可变的,对String类的任何改变,都是返回一个新的String类对象。但如果非要改变它也不是不可以,利用反射就可以做到。
我们都知道,String是java中的字符串,是不可变的,对String类的任何改变,都是返回一个新的String类对象。但如果非要改变它也不是不可以,利用反射就可以做到。
输出:
可见,一旦修改了一个String常量的值,所有字符串和它相等的变量的值都会改变,据说是因为它们在底层都是用的同一份数据,没验证。。。
嗯,强行改人家String的值有什么意义呢,除了真的很危险暂时还没想出来。。。
我们都知道,String是java中的字符串,是不可变的,对String类的任何改变,都是返回一个新的String类对象。但如果非要改变它也不是不可以,利用反射就可以做到。
import java.lang.reflect.Field; public class 反射String { 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反射修改常量,以及其局限
- JAVA反射修改常量,以及其局限(修改private final限制)
- Java中String不可变性以及通过反射进行修改
- Java中,利用反射机制修改定义出来的String对象本身。
- 黑马程序员 【】java学习之路——反射——修改字段
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- java反射修改静态方法的值setAccessible
- JAVA String对象和字符串常量的关系解析
- Java常量字符串String理解
- java如何修改String其中一个字符
- Java复习3.变量.常量.String.
- java当修改final对象、常量值时要重新编译类
- Java反射之Method Class.getMethod(String name, Class<?>... parameterTypes)
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- Java通过反射机制修改只读属性参数
- 通过JAVA反射修改JDK1.6*当中DNS缓存内容