Nur statische Felder abrufen, die in der Java-Klasse deklariert sind

Lesezeit: 3 Minuten

Ich habe folgende Klasse:

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

Ist es möglich, Reflektion zu verwenden, um nur eine Liste der statischen Felder zu erhalten? Mir ist bewusst, dass ich ein Array aller Felder mit erhalten kann Test.class.getDeclaredFields(). Aber es scheint, dass es keine Möglichkeit gibt, festzustellen, ob a Field Instanz stellt ein statisches Feld dar oder nicht.

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

    – Allen

    22. April 2015 um 10:59 Uhr


  • docs.oracle.com/javase/8/docs/api/java/lang/reflect/…

    – Orangenhund

    2. November 2016 um 14:59 Uhr

Benutzer-Avatar
Abhinav Sarkar

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

Ich bin zufällig über diese Frage gestolpert 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 aus Gründen der Lesbarkeit etwas verschönert. Eigentlich würdest du es wahrscheinlich so schreiben:

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

  • “Eigentlich würden Sie es wahrscheinlich so schreiben” … warum denken Sie, dass “eigentlich” diese Lesbarkeit nicht wichtig ist?

    – Michael

    16. Januar 2019 um 18:58 Uhr


  • Zunächst einmal denke ich nicht, dass es angemessen ist, jemandes Englisch auf einer Website wie dieser zu verspotten. Abgesehen davon glaube ich nicht, dass die Kommentare in dem ausgeschmückten Beispiel dazu dienen, die Lesbarkeit für jemanden zu verbessern, der sich auch nur annähernd mit Streams auskennt, ebenso wenig wie die nutzlose Rückgabevariable. Ich würde beide Geräusche in Betracht ziehen, 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 ist, als auch eines, das realistisch ist.

    – Drehmoment

    16. Januar 2019 um 20:12 Uhr

  • Ich habe mich nicht über dein Englisch lustig gemacht. Dein Englisch ist gut. Ich verstehe gar nicht, wovon du redest. 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 vorschlugen, dass “Verschönerung für die Lesbarkeit” schlecht ist, wenn die Lesbarkeit eine unglaublich wichtige Metrik für die Codequalität ist.

    – Michael

    16. Januar 2019 um 20:38 Uhr


Benutzer-Avatar
Salman Saleh

Ganz einfach, Sie können Modifier verwenden, um zu ü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");
}

Wenn Sie Ihrem Projekt Open-Source-Abhängigkeiten hinzufügen können, können Sie auch verwenden
FieldUtils.readDeclaredStaticField(Test.class,”a”)

1350870cookie-checkNur statische Felder abrufen, die in der Java-Klasse deklariert sind

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy