【Java】利用反射更改String的字符

 

问题:

在不改变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);
    }

 

posted @ 2022-03-14 09:30  emdzz  阅读(199)  评论(0编辑  收藏  举报