String s1 = "ABC"; //s1
String str = new String("A"+"BC");
//内存中创建了2个字符串对象
System.out.println(s1==str);//false
//利用反射API读取 s1和str的value属性
Class cls = String.class;
Field fld=cls.getDeclaredField("value");
//开放不可见的访问权限
fld.setAccessible(true);
char[] chs1 = (char[])fld.get(s1);
char[] chs2 = (char[])fld.get(str);
System.out.println(chs1==chs2);
chs2[2]='K';
System.out.println(s1);
}
}
三次输出结果:
false
true
ABK
设置的是chs2的第二个,输出的s1,结果是会发生改变的
private final char value[];
在String类里面这个属性是final,大家熟知final是不可改变的
但是,利用反射,是可以发生改变的,这就是Java反射的强大之处
反射在Java里面是一把双刃剑!