你能解释一下执行这段代码会发生什么吗?我知道它打印出"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)
反射不会"捕获"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对象和反射函数有何影响.
| 归档时间: |
|
| 查看次数: |
1263 次 |
| 最近记录: |