问题:
在不改变s变量引用的String对象的情况下,输出打印"abcd"
/*** * * @param args * @return void * @author cloud9 * @createTime 2022/3/11 17:04 * * 问题要求,不改变变量s的地址,输出 abcd */ public static void main(String[] args) throws Exception{ String s = new String("abc"); // todo ... ... System.out.println(s); } }
题目考察的是反射知识,String是不可改变的,但是字符串是由String中的char[]存储
所以可以通过反射拿到该对象的char[],来进行更改
我的解法:
/*** * * @param args * @return void * @author cloud9 * @createTime 2022/3/11 17:04 * * 问题要求,不改变变量s的地址,输出 abcd */ public static void main(String[] args) throws Exception{ String s = new String("abc"); // 调用反射 Class<? extends String> stringClass = s.getClass(); Field declaredField = stringClass.getDeclaredField("value"); declaredField.setAccessible(true); // 获取当前s应用的对象的值 Object o = declaredField.get(s); if (o instanceof char[]) { // 类型强转 char[] a = (char[])o; // 打印查看,验证是否是abc System.out.println(Arrays.toString(a)); // OK 没问题,更改赋值 a = new char[]{'a', 'b', 'c', 'd'}; declaredField.set(s, a); } System.out.println(s); }