这个Reflection Java代码如何捕获System.out.println中的String?

Lui*_*ano 12 java reflection

你能解释一下执行这段代码会发生什么吗?我知道它打印出"G'Day Mate.",但是Reflection如何捕获System.out.println?堆栈/堆级别会发生什么?非常感谢.

   public static void main(String... args) {
          System.out.println("Hello World");
    }

    static {
        try {
           Field value = String.class.getDeclaredField("value");
           value.setAccessible(true);
           value.set("Hello World", value.get("G'Day Mate."));
        } catch (Exception e) {
          throw new AssertionError(e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ale*_*tev 8

反射不会"捕获"System.out.当然你选择了最难的例子 - String,因为java String类是一个非常"有趣"的类,其中每个String不是一个对象,而是在一个字符串池中生成,并且本身是不可变的.

你的代码所做的是在java String类中它静态地(这意味着在执行时间之前)将字符串"Hello World"的值设置为"G`Day Mate.".这意味着无论何时使用字符串"Hello World",它都将更改为"G`Day Mate".例:

String h ="Hello World";
System.out.println(h);
>>>G`Day Mate.
Run Code Online (Sandbox Code Playgroud)

希望这个例子有所帮助.有趣的评论,代码:

public static void main(String[] args){
        String h = "Hello";
        System.out.println(h);
        System.out.println("Hello");
    }
     static {
            try {
               Field value = String.class.getDeclaredField("value");
               value.setAccessible(true);
               value.set("Hello", value.get("G'Day Mate."));
            } catch (Exception e) {
              throw new AssertionError(e);
            }
        }
Run Code Online (Sandbox Code Playgroud)

产生输出:

>>>G`Day
>>>G`Day
Run Code Online (Sandbox Code Playgroud)

这意味着在映射中白色空间会有所不同,但我不知道这对String对象和反射函数有何影响.

  • 正确,但不是很准确.每个字符串绝对是一个Object.字符串文字是存储在池中的String实例.并且代码更改了支持String文字"Hello World"的内部char数组的值. (5认同)