2010-08-06 25 views
123

Ho la seguente classe:recuperare solo campi statici dichiarati nella classe Java

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

E 'possibile utilizzare la reflection per ottenere un elenco dei soli 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.

+0

Io sono un Java più recente, voglio sapere perché Java non ha messo questi dispongono di tutti in classe Field come C#, Qual è il beneficio da questo progetto? Grazie. – Allen

+0

https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getModifiers-- – OrangeDog

risposta

244

Si può fare in questo modo:

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

Quello è semplice, è possibile utilizzare modificatore per verificare se un il campo è statico o no. 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"); 
} 
} 
2

ci siamo imbattuti in questa domanda per caso e dicono che aveva bisogno di una Java 8 aggiornamento utilizzando i flussi:

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

Ovviamente, il campione è un po 'embelished per migliorare la leggibilità. In realtà, si sarebbe probabilmente scrivere in questo modo:

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