これは私の最初の質問です。間違いなく間違いはありません。 何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のクラッシュを知りたい...
おかげ
使用しているJVMのバージョンは? –
JREバージョン:6.0_22-b04 – vemjol