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 instance de Field
représente un champ statique ou non.
Vous pouvez le faire comme ça:
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);
}
}
Je suis tombé par hasard sur cette question et je pensais 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 perfectionné pour plus de lisibilité. En fait, vous écririez probablement ceci comme ceci:
public static List<Field> getStatics(Class<?> clazz) {
return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
Modifier.isStatic(f.getModifiers())).collect(toList());
}
Si vous pouvez ajouter des dépendances open-source à votre projet, vous pouvez également utiliser FieldUtils.readDeclaredStaticField (Test.class, "a")
C'est simple, vous pouvez utiliser Modificateur 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");
}