这是我的第一个问题,希望不要犯任何可怕的错误。假设没有 SecurityManager 阻止我这样做:
public static void main(String[] args) {
String str = "1";
System.out.println("str value before invoke fillStringValueWithX method: " + str);
fillStringValueWithX(str);
System.out.println("str value before invoke fillStringValueWithX method: " + str);
}
private static void fillStringValueWithX(String str) {
if (str != null) {
try {
Field fieldValue = String.class.getDeclaredField("value");
fieldValue.setAccessible(true);
char[] charValue = (char[]) fieldValue.get(str);
Arrays.fill(charValue, 'x');
fieldValue.setAccessible(false);
} catch (Exception e) {}
}
}
如果字符串的大小为 1(上面的示例),则 JVM 崩溃(崩溃转储显示 EXCEPTION_ACCESS_VIOLATION 错误)但是如果字符串的大小大于 1,则此代码片段对我有用。
注意: 我假设通过反射设置字段值的适当用途是使用valueField.set(obj, value)
Field 方法,但我想知道为什么 JVM 崩溃......
谢谢