Modifier Booléen chaîne de valeurs à l'aide de la réflexion ne fonctionne pas
Je faisais des expériences avec Java réflexion et inline Cordes et est venu avec le résultat que je trouve déroutant.
import java.lang.reflect.Field;
public class HappyDebugging {
public static void main(String[] args) throws Exception {
defineTrueFalse();
System.out.println("true is " + true); //why is it "true is true"?
System.out.println("false is " + false);
System.out.println(true);
System.out.println(false);
System.out.println("true");
System.out.println("false");
System.out.println("true is " + Boolean.valueOf(true));
System.out.println("false is " + Boolean.valueOf(false));
System.out.println("true is " + Boolean.valueOf("true"));
System.out.println("false is " + Boolean.valueOf("false"));
}
static void defineTrueFalse() throws Exception{
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
field.set("true", new char[] {'f', 'a', 'l', 's', 'e'});
field.set("false", new char[] {'t', 'r', 'u', 'e'});
field = String.class.getDeclaredField("offset");
field.setAccessible(true);
field.setInt("true", 0);
field.setInt("false", 0);
field = String.class.getDeclaredField("count");
field.setAccessible(true);
field.setInt("true", 5);
field.setInt("false", 4);
}
}
Pourquoi deux premières lignes de la sortie sont
true is true
false is false
Je m'attends à être
true is false
false is true
Veuillez noter la sortie varie sur différentes plates-formes.
Pas sûr de ce Champ de chose est, mais je ne pense pas que vous écrasez rien du tout, puisque la fonction (defineTrueFalse()) est nul c'est donc toujours l'impression de vrai (true et false false)
Semble que tout ce que vous faites est en invoquant un comportement non défini par la rupture
RTM docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html
Il n'est pas primordial quoi que ce soit. Il est de jongler avec les valeurs de champ (
Ah je vois maintenant. Désolé pour la mauvaise interprétation de la question. S'il vous plaît ignorer mon commentaire. Merci pour les réponses.
Semble que tout ce que vous faites est en invoquant un comportement non défini par la rupture
String.class
internes.RTM docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html
Il n'est pas primordial quoi que ce soit. Il est de jongler avec les valeurs de champ (
value
, offset
et count
) contenue à l'intérieur de la String
objets représentés par les littéraux "true"
et "false"
.Ah je vois maintenant. Désolé pour la mauvaise interprétation de la question. S'il vous plaît ignorer mon commentaire. Merci pour les réponses.
OriginalL'auteur Vladimir Zhilyaev | 2012-01-04
Vous devez vous connecter pour publier un commentaire.
Dans mon compilateur, ces deux lignes se compilé pour utiliser la réelle chaînes
"true is true"
et"false is false"
(qui est, sans aucun moment de l'exécution de la concaténation se produit), de sorte que votre réfléchissant mal vient trop tard. Vous dites que la production dépend de la plate-forme, donc je suppose que certains compilateurs ne doit pas effectuer cette optimisation.merci @ruakh qui l'explique
que et la implementaion de
AbstractStringBuilder.append(boolean b)
OriginalL'auteur ruakh
cela semble être au travail....
OriginalL'auteur Gil
defineTrueFalse
n'a aucun effet si"true is " + true
est traitée comme"true is " + Boolean.toString(true)
c'est pourquoi elle vous donner le résultat quetrue is true
OriginalL'auteur Sunil Kumar Sahoo
La réponse est simple. Ces deux lignes
effectuer les opérations suivantes.
1. la simple valeur de type booléen "vrai" est converti en Chaîne qui aboutit à la chaîne "true". De même pour les "faux", et qu'il
OriginalL'auteur Hons
Parce que vous êtes de jouer avec le contenu de l'internement des littéraux de Chaîne (qui sera sacrément votre âme à la souffrance éternelle dans le neuvième cercle de l'enfer, je pourrais ajouter), mais vos deux premières lignes de concaténer des littéraux booléens, pas de littéraux de Chaîne. Rien dans
defineTrueFalse()
a aucun effet sur les valeurs booléennestrue
etfalse
(par opposition à la littéraux de Chaîne"true"
et"false"
).Mais pas pour les deux premières lignes, je l'avais mise. Pour liés à la Chaîne des choses que peut-être, car le comportement dépend du stage de littéraux de Chaîne, je ne pense pas qu'il est garanti par la spec (ainsi, le neuvième cercle de l'Enfer).
OriginalL'auteur Michael Borgwardt