Reflectively de l'accès à une variable statique dans une classe Java
J'ai pas d'autre choix que d'accéder à un ensemble de classes, je ne peux pas modifier, avec cette structure, grâce à la réflexion.
À l'aide de la méthode indiquée dans la principale méthode ci-dessous, cependant, déclenche une exception NullPointerException. Le pointeur null "tableau" dans le constructeur lors de la f1.get(null) est appelée.
Je ne suis pas en mesure d'instancier les classes à l'avance, car le seul constructeur est celui qui est affiché, ce qui est privé. Donc, il n'y a aucun moyen pour moi de définir explicitement la table.
Quelqu'un connais un moyen pour moi de reflectively appel Héritage.Un?
public class Legacy {
public static final Legacy A = new Legacy("A");
public static final Legacy B = new Legacy("B");
private String type0;
private static Map<String, Legacy> table = new HashMap<String, Legacy>();
private Legacy(String id) {
type0 = id;
table.put(type0, this);
}
public static void main(String[] args) throws Exception {
Field f1 = Legacy.class.getDeclaredField("A");
Object o = f1.get(null);
}
}
En avant "la Réflexion == MAUVAIS!!!"
En fait, je ne vois aucun moyen que vous pouvez accéder à l'Héritage.Un sans un NPE, de réflexion ou pas (remplacez code de réflexion avec 'Object o = Héritage.'Pour le voir). Quand j'ai essayé de l'exécution de votre code, l'exception s'est produite lors de l'initialisation de la classe.
C'est ce que je reçois pour avoir le code d'auto-mise en forme sur les sauvegardes.
C'est ce que je reçois pour avoir le code d'auto-mise en forme sur les sauvegardes.
OriginalL'auteur Andrew | 2009-08-10
Vous devez vous connecter pour publier un commentaire.
L'ordre des initialiseurs statiques est faux, le tableau doit venir avant que le constructeur appelle.
C'est la raison pour laquelle vous obtenez l'exception lorsque la classe est chargé et initialisé. Cela n'a rien à voir avec la réflexion.
OriginalL'auteur starblue
Puisque c'est déroutant, je voudrais écrire comme ceci:
De cette façon, même si les membres de changement d'emplacement (en raison de refactoring, la ligne d'alignement ou autre), le code sera toujours.
OriginalL'auteur Aviad Ben Dov
J'ai essayé ceci, parce que je ne pouvais pas voir ce qui n'allait pas avec votre exemple. Il a travaillé si j'ai réorganisé les déclarations:
La statique des déclarations besoin de l' (précédent) du constructeur.
OriginalL'auteur Steve B.