Pobierz tylko pola statyczne zadeklarowane w klasie Java

163

Mam następującą klasę:

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

Czy można użyć odbicia, aby uzyskać listę tylko pól statycznych? Wiem, że mogę uzyskać tablicę wszystkich pól za pomocą Test.class.getDeclaredFields(). Ale wydaje się, że nie ma sposobu, aby określić, czy Fieldinstancja reprezentuje pole statyczne, czy nie.

Anders
źródło
Jestem nowszą wersją Java, chcę wiedzieć, dlaczego Java nie umieściła tych wszystkich funkcji w klasie Field, takiej jak C #. Jakie są korzyści z tego projektu? Dzięki.
Allen

Odpowiedzi:

327

Możesz to zrobić w ten sposób:

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
źródło
12

Przypadkowo natknąłem się na to pytanie i poczułem, że potrzebna jest aktualizacja Java 8 za pomocą 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 ta próbka jest nieco upiększona ze względu na czytelność. W rzeczywistości prawdopodobnie napisałbyś to w ten sposób:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}
Moment obrotowy
źródło
4
„W rzeczywistości prawdopodobnie napisałbyś to w ten sposób”… dlaczego myślisz, że „w rzeczywistości” ta czytelność nie jest ważna?
Michael
2
Po pierwsze, nie sądzę, aby kpić z czyjegoś angielskiego na takiej stronie jak ta jest właściwe. Poza tym nie sądzę, aby komentarze w ozdobionym przykładzie służyły poprawie czytelności dla kogoś, kto choć trochę zna strumienie, ani bezużyteczna zmienna zwrotna. Rozważyłbym oba szumy, gdybym napotkał je w rzeczywistym kodzie. Mając większe doświadczenie ze strumieniami za moim pasem, dzisiaj zdecydowałbym się zachować oryginalne nowe linie dla większej czytelności. Nikt nie jest idealny. Chciałem podać zarówno przykład, który byłby wyraźny dla nowych programistów, jak i taki, który byłby realistyczny.
Torque
3
Nie kpiłem z twojego angielskiego. Twój angielski jest dobry. Nawet nie rozumiem, o czym mówisz. I tak, zgadzam się, że komentarze są zbędne i że formatowanie pierwszego jest znacznie lepsze. Chodziło mi o to, że wydawało się, że sugerujesz, iż „upiększanie w celu zwiększenia czytelności” jest złe, podczas gdy czytelność jest niezwykle ważną miarą jakości kodu.
Michael
0

To proste, możesz użyć modyfikatora, aby sprawdzić, czy pole jest statyczne, czy 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");
}
Salman Saleh
źródło