他在做什么:
他正在获取一个他知道正确长度的字符数组(例如String的大写版本),并将其作为String的后备数组。(支持数组
value在String类内部调用。)
他为什么这样做:
为了说明您可以在其中放置任何char数组。
为什么这样有用:
字符串是不可变的,这使您可以规避不可变性。当然, 不建议这样做-EVER
。相反,如果他说“当心,因为人们可能会对您的代码执行此操作。即使您认为自己的东西是安全的,也可能不是!”,我不会感到惊讶。
其含义是广泛的。不可变的变量不再是不可变的。最终变量不再是最终变量。线程安全对象不再是线程安全的。您认为可以依靠的合同,您将不再可以依靠。所有这些都是因为某个地方的某个工程师遇到了一个他用常规手段无法解决的问题,因此他努力思考以解决问题。
不要成为“那个家伙”。
您还将注意到,现在将如何更改该String的hashCode。因此,如果您从未计算过该String的hashCode,它仍为0,所以您可以。另一方面,如果您已经计算出它,那么当您将其放入HashMap或HashSet中时,将不会检索它。
考虑以下:
import java.util.*;import java.lang.reflect.*;class HashTest { public static void main(String[] args) throws Exception { Set<String> set = new HashSet<String>(); String str = "StackOverflow"; System.out.println("Orig hash: " + str.hashCode()); set.add(str); Field stringValue = String.class.getDeclaredField("value"); stringValue.setAccessible(true); stringValue.set(str, str.toUpperCase().toCharArray()); // System.out.println("New value: " + str); String copy = new String(str); // force a copy System.out.println("Contains orig: " + set.contains(str)); System.out.println("Contains copy: " + set.contains(copy)); }}我敢打赌他这样做是为了警告人们不要不良行为,而不是表现出“酷”的把戏。
编辑:我找到了您所指的文章,以及它所基于的文章。原始文章指出:“这意味着,如果另一个程序包中的一个类在内部字符串的作用下“摆弄”,则会对您的程序造成破坏。这是件好事吗?(您无需回答;-)认为这很清楚,这更像是保护指南,而不是关于编码的建议。
因此,如果您仅通过一条信息就离开了该线程,那就是反射是危险的,不可靠的,并且不容小!!



