import java.lang.reflect.Field;
public class test {
public static void main(String[] args) throws Throwable, SecurityException {
// TODO Auto-generated method stub
String ss = "Hello World!!!";
System.out.println(ss);
/**
* String是不可以更改的这也是为什么这些方法都有返回值的原因其实是新new了
* 地址让这个ss指向这个新的地址而已,之前存在的Hello World还是存在的
* */
ss.replace("H", "h");//下述源码
System.out.println(ss);
/**
* String是不可以更改的这也是为什么这些方法都有返回值的原因其实是新new了
* 地址让这个ss指向这个新的地址而已,之前存在的Hello World还是存在的
* 怎么样才能改变呢,可以利用反射机制进行修改属性值的访问权限
* */
//源码中String这个类里面有这个private final 的value变量声明,我们的内容其实就是放在了这个数组里面
Field valueFieldOfString = String.class.getDeclaredField("value");
//改变value属性的访问权限
valueFieldOfString.setAccessible(true);
//获取s对象上的value属性的值
char[] value = (char[]) valueFieldOfString.get(ss);
value[5] = '_';
System.out.println("利用反射机机制进行修改后的值"+ss);
}
}
关于replace这个函数源码
public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
int len = value.length;
int i = -1;
char[] val = value; /* avoid getfield opcode */
while (++i < len) {
if (val[i] == oldChar) {
break;
}
}
if (i < len) {
char buf[] = new char[len];
for (int j = 0; j < i; j++) {
buf[j] = val[j];
}
while (i < len) {
char c = val[i];
buf[i] = (c == oldChar) ? newChar : c;
i++;
}
//由此可见开辟了一个新的地址 通过返回值让ss改变
//指向 ,指向此处new的String。
return new String(buf, true);//下述源码
}
}
return this;
}
String(char[] value, boolean share) {
// assert share : "unshared not supported";
//这个地方的this.value就是一开始说的String这
//个类里的private final char型的一个数组
this.value = value;
}
参考—>
http://blog.youkuaiyun.com/zhangjg_blog/article/details/18319521