Ceci est ma première question J'espère ne pas faire une erreur terrible. En supposant qu'aucun SecurityManager me empêche de le faire:JVM se bloque en essayant de modifier la valeur de chaîne en utilisant la réflexion
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) {}
}
}
Si la taille de la chaîne est de 1 (l'exemple ci-dessus) le crash machine virtuelle Java (le vidage sur incident montre une erreur EXCEPTION_ACCESS_VIOLATION) si la taille de la chaîne est supérieur à 1 cet extrait de code fonctionne pour moi.
Note: Je suppose que l'utilisation correspond le pour la mise en valeur d'un champ par réflexion utilise la méthode valueField.set(obj, value)
sur le terrain, mais je veux savoir pourquoi le crash machine virtuelle Java ...
Merci
Quelle version de JVM utilisez-vous? –
Version JRE: 6.0_22-b04 – vemjol