[关闭]
@zero1036 2016-12-31T01:55:58.000000Z 字数 768 阅读 1340

String通过反射实现可变(只证明,不推荐)

Java-Base


  1. package com.base;
  2. import java.lang.reflect.Field;
  3. /**
  4. * Created by linzc on 2016/11/9.
  5. */
  6. public class StringChange {
  7. //String不可变,但可以通过反射得出String的成员变量value(char[]),并修改其数组的字符达到修改string效果
  8. //补充一点:string的value由private final char value[]修饰,final只是表示不可改变value指向的数组,但可以改变该数组
  9. //结论:证明String其实是可变的,但通过反射修改所谓的不可变对象是不推荐的
  10. public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
  11. //创建字符串"Hello World", 并赋给引用s
  12. String s = "Hello World";
  13. System.out.println("s = " + s); //Hello World
  14. //获取String类中的value字段
  15. Field valueFieldOfString = String.class.getDeclaredField("value");
  16. //改变value属性的访问权限
  17. valueFieldOfString.setAccessible(true);
  18. //获取s对象上的value属性的值
  19. char[] value = (char[]) valueFieldOfString.get(s);
  20. //改变value所引用的数组中的第5个字符
  21. value[5] = '_';
  22. System.out.println("s = " + s); //Hello_World
  23. }
  24. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注