2010-12-06 9 views
2

これは私の最初の質問です。間違いなく間違いはありません。 何SecurityManagerがこれをやってから私を防止していないと仮定すると:リフレクションを使用して文字列値を変更しようとすると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より大きい場合、このコードスニペットは私のために働きます。

注:私は反射を経由して、フィールドの値を設定するためのappropiate使用はvalueField.set(obj, value)フィールドメソッドを使用していることを前提としていますが、私は、なぜJVMのクラッシュを知りたい...

おかげ

+0

使用しているJVMのバージョンは? –

+0

JREバージョン:6.0_22-b04 – vemjol

答えて

3

患者:医者、医者、これをすると痛い(ハンマーで腕を打つ)。

医者:そうしないでください。

実際にはの文字列の内容を混乱させるべきではありません。文字列は不変であるように設計されています。今私はそれが非常にクラッシュするJVMのバグだと言っています(私のボックスにはありません、btw - 使用しているオペレーティングシステムとJVMバージョンを教えてください)。システムの背後に行こうとしないでください。

0

それは"1"のための文字の配列のように見え、(など"true""false""root""class"、など)他のインターンの文字列の数は、WindowsのJVMに変更することはできません。私。配列要素に新しい値を代入することはできません。しかし、そのStringオブジェクトに新しい配列を割り当てることができます。 Example

関連する問題