Récupérer uniquement les champs statiques déclarés dans la classe Java

163

J'ai la classe suivante:

public class Test {
    public static int a = 0;
    public int b = 1;
}

Est-il possible d'utiliser la réflexion pour obtenir une liste des champs statiques uniquement? Je suis conscient que je peux obtenir un tableau de tous les champs avec Test.class.getDeclaredFields(). Mais il semble qu'il n'y ait aucun moyen de déterminer si une Fieldinstance représente un champ statique ou non.

Anders
la source
Je suis un java plus récent, je veux savoir pourquoi Java n'a pas mis toutes ces fonctionnalités dans une classe Field comme C #, quel est l'avantage de cette conception? Merci.
Allen

Réponses:

327

Vous pouvez le faire comme ceci:

Field[] declaredFields = Test.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields) {
    if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        staticFields.add(field);
    }
}
Abhinav Sarkar
la source
12

Je suis tombé sur cette question par accident et j'ai senti qu'il fallait une mise à jour Java 8 à l'aide de flux:

public static List<Field> getStatics(Class<?> clazz) {
    List<Field> result;

    result = Arrays.stream(clazz.getDeclaredFields())
            // filter out the non-static fields
            .filter(f -> Modifier.isStatic(f.getModifiers()))
            // collect to list
            .collect(toList());

    return result;
}

De toute évidence, cet échantillon est un peu embelli pour la lisibilité. En fait, vous l'écririez probablement comme ceci:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}
Couple
la source
4
"En fait, vous l'écririez probablement comme ceci" ... pourquoi pensez-vous que "en réalité" cette lisibilité n'est pas importante?
Michael
2
Tout d'abord, je ne pense pas qu'il soit approprié de se moquer de l'anglais sur un site comme celui-ci. En dehors de cela, je ne crois pas que les commentaires dans l'exemple embelli servent à améliorer la lisibilité pour quelqu'un, même à distance familier avec les flux, ni la variable de retour inutile. Je considérerais les deux bruits si je les rencontrais dans le code réel. Avec plus d'expérience avec les flux à mon actif, j'opterais aujourd'hui pour conserver les nouvelles lignes d'origine pour plus de lisibilité. Personne n'est parfait. Je voulais fournir à la fois un exemple explicite pour les nouveaux programmeurs et un exemple réaliste.
Couple le
3
Je ne me moquais pas de votre anglais. Ton anglais est bon. Je ne comprends męme pas de quoi tu parles. Et oui, je conviens que les commentaires sont superflus et que la mise en forme du premier est bien meilleure. Mon point était que vous sembliez suggérer que «embellir pour la lisibilité» est mauvais, alors que la lisibilité est une métrique de qualité de code extrêmement importante.
Michael
0

C'est simple, vous pouvez utiliser Modifier pour vérifier si un champ est statique ou non. Voici un exemple de code pour ce type de tâche.

public static void printModifiers(Object o) {
    Class c = o.getClass();
    int m = c.getModifiers();
    if (Modifier.isPublic(m))
        System.out.println ("public");
    if (Modifier.isAbstract(m))
        System.out.println ("abstract");
    if (Modifier.isFinal(m))
        System.out.println ("final");
    if(Modifier.isStatic(m))
        System.out.println("static");
}
Salman Saleh
la source