gpt4 book ai didi

java - 此反射 Java 代码如何捕获 System.out.println 中的字符串?

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:46 26 4
gpt4 key购买 nike

你能给我解释一下执行这段代码会发生什么吗?我知道它会打印出“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);
}
}

最佳答案

反射不会“捕获”System.out。当然,您已经选择了最难的示例 - String,这是因为 java String 类是一个非常“有趣”的类,其中每个 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.

希望这个例子对您有所帮助。有趣的话,代码:

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);
}
}

产生输出:

>>>G`Day
>>>G`Day

这意味着在映射中空白会产生一些差异,但我不知道这对 String 对象和反射函数有何影响。

关于java - 此反射 Java 代码如何捕获 System.out.println 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11700891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com