這是我的第一個問題,我希望不會犯任何可怕的錯誤。 假設沒有安全管理器阻止我這樣做:嘗試使用反射修改字符串值時JVM崩潰
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)
場的方法,但我想知道爲什麼JVM崩潰...
感謝
您使用的是什麼版本的JVM? – 2010-12-06 19:21:59