Rufen Sie nur statische Felder ab, die in der Java-Klasse deklariert sind


163

Ich habe folgende Klasse:

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

Ist es möglich, mithilfe der Reflexion nur eine Liste der statischen Felder abzurufen? Ich bin mir bewusst, dass ich mit allen Feldern ein Array erhalten kann Test.class.getDeclaredFields(). Es scheint jedoch nicht möglich zu sein, festzustellen, ob eine FieldInstanz ein statisches Feld darstellt oder nicht.


Ich bin ein Java-Neuerer. Ich möchte wissen, warum Java diese Funktion nicht alle in die Field-Klasse wie C # aufgenommen hat. Was ist der Vorteil dieses Designs? Vielen Dank.
Allen

Antworten:


327

Sie können es so machen:

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

12

Ich bin zufällig auf diese Frage gestoßen und hatte das Gefühl, dass ein Java 8-Update mit Streams erforderlich ist:

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

Offensichtlich ist dieses Beispiel für die Lesbarkeit etwas verschönert. In der Tat würden Sie es wahrscheinlich so schreiben:

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

4
"Eigentlich würden Sie es wahrscheinlich so schreiben" ... warum denken Sie, dass "in Wirklichkeit" diese Lesbarkeit nicht wichtig ist?
Michael

2
Zunächst einmal halte ich es nicht für angebracht, jemanden auf einer solchen Site über Englisch zu verspotten. Abgesehen davon glaube ich nicht, dass die Kommentare im verschönerten Beispiel dazu dienen, die Lesbarkeit für jemanden zu verbessern, der auch nur aus der Ferne mit Streams vertraut ist, und die nutzlose Rückgabevariable auch nicht. Ich würde beide Geräusche berücksichtigen, wenn ich sie im tatsächlichen Code antreffen würde. Mit mehr Erfahrung mit Streams würde ich mich heute dafür entscheiden, die ursprünglichen Zeilenumbrüche für die Lesbarkeit beizubehalten. Niemand ist perfekt. Ich wollte sowohl ein Beispiel liefern, das für neue Programmierer explizit war, als auch ein Beispiel, das realistisch war.
Drehmoment

3
Ich habe dein Englisch nicht verspottet. Dein Englisch ist gut. Ich verstehe nicht einmal, wovon du sprichst. Und ja, ich stimme zu, dass die Kommentare überflüssig sind und dass die Formatierung des ersten viel besser ist. Mein Punkt war, dass Sie anscheinend behaupteten, "Verschönern für Lesbarkeit" sei schlecht, wenn Lesbarkeit eine unglaublich wichtige Metrik für die Codequalität ist.
Michael


0

Das ist einfach: Mit dem Modifikator können Sie überprüfen, ob ein Feld statisch ist oder nicht. Hier ist ein Beispielcode für diese Art von Aufgabe.

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");
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.