2010-12-06 23 views
2

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

+0

Quelle version de JVM utilisez-vous? –

+0

Version JRE: 6.0_22-b04 – vemjol

Répondre

3

patient: Docteur , médecin, ça fait mal quand je fais cela (bangs bras avec le marteau).

Docteur: Ne faites pas ça alors.

Vous vraiment ne devrait pas essayer de jouer avec le contenu d'une chaîne. Les chaînes sont conçues pour être immuables. Maintenant, j'ose dire que c'est un bogue de la JVM qui se bloque si brutalement (ce n'est pas sur ma boîte, btw - ce serait utile si vous nous disiez quel système d'exploitation et quelle version JVM vous utilisez) mais la réponse est simple ne pas essayer d'aller derrière le dos du système.

0

il ressemble à ce tableau de caractères pour "1" et un certain nombre d'autres cordes internées (comme "true", "false", "root", "class", etc.) ne peuvent être modifiés dans JVM de Windows. C'est à dire. vous ne pouvez pas affecter de nouvelles valeurs aux éléments du tableau. Mais vous pouvez assigner un nouveau tableau pour cet objet String. Example