2010-08-06 13 views
123

Mam następujące klasy:pobrać tylko statycznych pól zadeklarowane w klasie Java

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

Czy można użyć refleksji uzyskać listę tylko statycznych pól? Jestem świadomy, że mogę uzyskać tablicę wszystkich pól z Test.class.getDeclaredFields(). Ale wydaje się, że nie ma sposobu, aby ustalić, czy instancja Field reprezentuje pole statyczne, czy nie.

+0

Jestem java nowsze, chcę wiedzieć dlaczego Java nie umieścić te wyposażone są we wszystkie klasy polowego jak C# Jakie są korzyści z tego projektu? Dzięki. – Allen

+0

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

Odpowiedz

244

Można to zrobić tak:

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

Ów prosty, można wykorzystać modyfikator do sprawdzenia, czy pole jest statyczne lub nie. Oto przykładowy kod dla tego rodzaju zadania.

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

natknąłem to pytanie przez przypadek i uważało, że potrzebna Java 8 aktualizacji przy użyciu strumieni:

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

Oczywiście, że próbka jest nieco embelished dla czytelności. W rzeczywistości, to prawdopodobnie napisać to tak:

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