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.
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:
“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
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");
}
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