gpt4 book ai didi

java - 这个 Java 代码片段是如何工作的? (字符串池和反射)

转载 作者:IT老高 更新时间:2023-10-28 11:41:28 25 4
gpt4 key购买 nike

Java 字符串池加上反射可以在 Java 中产生一些难以想象的结果:

import java.lang.reflect.Field;

class MessingWithString {
public static void main (String[] args) {
String str = "Mario";
toLuigi(str);
System.out.println(str + " " + "Mario");
}

public static void toLuigi(String original) {
try {
Field stringValue = String.class.getDeclaredField("value");
stringValue.setAccessible(true);
stringValue.set(original, "Luigi".toCharArray());
} catch (Exception ex) {
// Ignore exceptions
}
}
}

上面的代码会打印出来:

"Luigi Luigi" 

马里奥怎么了?

最佳答案

What happened to Mario ??

基本上你改变了它。是的,通过反射,您可以违反字符串的不变性......并且由于字符串实习,这意味着“Mario”的任何使用(除了在更大的字符串常量表达式中,这将在编译时解决)将结束在程序的其余部分中升级为“Luigi”。

这种事情就是为什么反射需要安全权限...

请注意,表达式 str + ""+ "Mario" 不会执行任何编译时连接,因为 +< 的左关联性。它实际上是 (str + "") + "Mario",这就是为什么你仍然会看到 Luigi Luigi。如果您将代码更改为:

System.out.println(str + (" " + "Mario"));

...然后你会看到 Luigi Mario 因为编译器会将 "Mario" 转换为与 "Mario" 不同的字符串>.

关于java - 这个 Java 代码片段是如何工作的? (字符串池和反射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32623834/

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