2010-12-06 38 views
2

這是我的第一個問題,我希望不會犯任何可怕的錯誤。 假設沒有安全管理器阻止我這樣做:嘗試使用反射修改字符串值時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崩潰...

感謝

+0

您使用的是什麼版本的JVM? – 2010-12-06 19:21:59

回答

3

病人:醫生,醫生,當我這樣做的時候疼(劉海用錘子)。

醫生:那麼不要那樣做。

你真的不應該試圖弄亂一個字符串的內容。字符串被設計成不可變的。現在我敢說這是一個JVM錯誤,它崩潰得如此之快(它不在我的盒子裏,順便說一句 - 如果你告訴我們你正在使用哪種操作系統和JVM版本,這會很有用),但簡單的答案是不要試圖落後於系統的後面。

0

它看起來像該陣列的字符爲"1"和其他一些實習字符串(如"true""false""root""class"等)不能在Windows JVM改變。即您不能將新值分配給數組元素。但是您可以爲該String對象分配新數組。 Example