package reflect;
import java.lang.reflect.Field;
/**
* @ClassName: TestReflect
* @Description:
* @Author: xuezhouyi
* @Version: V1.0
**/
public class TestReflect {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
f0();
System.out.println("--------------------");
f1();
System.out.println("--------------------");
f2();
}
public static void f0(){
/* 看上去栈中s1存的好像是常量值,s2存的是地址,其实都是地址 */
String s1 = "abc";
String s2 = new String("abc");
System.out.println("s1="+s1+"|s2="+s2+"|"+(s1==s2));
}
public static void f1() throws NoSuchFieldException, IllegalAccessException {
/* s1和s2在栈中开辟空间存放字符串常量池中的地址 */
String s1 = "abc";
String s2 = "aXc";
/* 比较栈中的地址肯定不同 */
System.out.println("s1="+s1+"|s2="+s2+"|"+(s1==s2));
Class<String> stringClass = String.class;
Field fValue = stringClass.getDeclaredField("value");
fValue.setAccessible(true);
char[] chars = (char[]) fValue.get(s2);
/* 强制修改成相同的字符串,栈中的地址没有被修改所以仍为false */
chars[1] = 'b';
System.out.println("s1="+s1+"|s2="+s2+"|"+(s1==s2));
}
public static void f2() throws NoSuchFieldException, IllegalAccessException {
String s1 = "abc";
String s2 = "abc";
System.out.println("s3="+s1+"|s4="+s2+"|"+(s1==s2));
Class<String> stringClass = String.class;
Field fValue = stringClass.getDeclaredField("value");
fValue.setAccessible(true);
char[] chars = (char[]) fValue.get(s2);
chars[1] = 'X';
System.out.println("s3="+s1+"|s4="+s2+"|"+(s1==s2));
}
}