Recupera solo i campi statici dichiarati nella class Java

Ho la seguente class:

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

È ansible utilizzare la riflessione per ottenere solo un elenco dei campi statici? Sono consapevole che posso ottenere una matrice di tutti i campi con Test.class.getDeclaredFields() . Ma sembra che non ci sia modo di determinare se un’istanza Field rappresenta un campo statico o meno.

Puoi farlo in questo modo:

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

Mi sono imbattuto per caso in questa domanda e ho ritenuto necessario un aggiornamento di Java 8 utilizzando gli stream:

 public static List getStatics(Class clazz) { List 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; } 

Ovviamente, quel campione è un po ‘impreziosito per la leggibilità. In realtà, probabilmente lo scriverai in questo modo:

 public static List getStatics(Class clazz) { return Arrays.stream(clazz.getDeclaredFields()).filter(f -> Modifier.isStatic(f.getModifiers())).collect(toList()); } 

Se è ansible aggiungere dipendenze open source al progetto, è ansible utilizzare anche FieldUtils.readDeclaredStaticField (Test.class, “a”)

Quello è semplice, è ansible utilizzare Modificatore per verificare se un campo è statico o meno. Ecco un codice di esempio per questo tipo di attività.

 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"); } }