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.

Anders
quelle
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);
    }
}
Abhinav Sarkar
quelle
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());
}
Drehmoment
quelle
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");
}
Salman Saleh
quelle