Jetzt möchte ich alle privaten Felder (aaa, bbb, ccc) der Klasse SomeClass (Ohne die Namen aller Felder im Voraus zu kennen) und überprüfen Sie deren Typ.
@atk Niemand zwingt dich zu antworten; Aber für viele von uns, die auf diese Frage von Google stoßen, ist die beste Antwort eine weitaus prägnantere Erklärung als das Lesen langer Posts zum Nachdenken. Selbst die vielen Fragen wie diese tragen dazu bei, was SO heute ist.
– Angad
3. September 2015 um 8:07 Uhr
Siehe Wie lese ich ein privates Feld in Java?
– Martin Schröder
25. September 2015 um 9:23 Uhr
Kyrill Ka
Es ist möglich, alle Felder mit der Methode zu erhalten getDeclaredFields() von Class. Dann müssen Sie den Modifikator jedes Felds überprüfen, um die privaten zu finden:
List<Field> privateFields = new ArrayList<>();
Field[] allFields = SomeClass.class.getDeclaredFields();
for (Field field : allFields) {
if (Modifier.isPrivate(field.getModifiers())) {
privateFields.add(field);
}
}
Beachten Sie, dass getDeclaredFields() gibt keine geerbten Felder zurück.
Schließlich erhalten Sie den Typ der Felder mit der Methode Field.getType().
Ich denke, die Tatsache, dass ich gegen eine kompilierte Klasse arbeite, macht es ziemlich unbequem, weil die zurückgegebenen Felder Namen wie haben m0, m1etc., und sind vom Typ java.lang.reflect.Method. Dies könnte daran liegen, dass ich versuche, Reflektion für eine Spring Bean zu verwenden, die an eine Schnittstelle gecastet wird.
– zahlen
10. Dezember 2020 um 19:41 Uhr
Kevin Bowersox
Sie können verwenden Modifier um festzustellen, ob ein Feld privat ist. Verwenden Sie unbedingt die getDeclaredFields -Methode, um sicherzustellen, dass Sie private Felder aus der Klasse abrufen, aufrufen getFields gibt nur die öffentlichen Felder zurück.
public class SomeClass {
private String aaa;
private Date date;
private double ccc;
public int notPrivate;
public static void main(String[] args) {
List<Field> fields = getPrivateFields(SomeClass.class);
for(Field field: fields){
System.out.println(field.getName());
}
}
public static List<Field> getPrivateFields(Class<?> theClass){
List<Field> privateFields = new ArrayList<Field>();
Field[] fields = theClass.getDeclaredFields();
for(Field field:fields){
if(Modifier.isPrivate(field.getModifiers())){
privateFields.add(field);
}
}
return privateFields;
}
}
@AfzaalAhmadZeeshan, warum hast du meine Bearbeitung “clazz” in “class” geändert, wenn wir eindeutig die Variable “clazz” und nicht das Schlüsselwort “class” verwenden müssen?
– Vallentin
17. November 2013 um 19:05 Uhr
Es tut mir leid für diesen Fehler, ich dachte, dies sei ein Fehler, da dem Dokument oder dem Code nirgendwo eine Variable zugeordnet war! Verzeih mir das..
– Afzaal Ahmad Zeeshan
17. November 2013 um 19:25 Uhr
@AfzaalAhmadZeeshan es gab eine Variable, sie befindet sich in den Argumenten der Methode. Möchten Sie Ihre Änderung jedoch widerrufen, da ich sie nicht ändern kann.
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
// ...
Field field = null;
// retrieve the field in some way
// ...
Modifier.isPrivate(field.getModifiers())
auf einer einzigen Field Objekt, das zurückkehrt true wenn das Feld ist private
Sammle alle Felder einer Klasse
Zu Sammle alle Felder verwenden:
1) Wenn Sie nur die Felder der Klasse ohne die Felder aus der Klassenhierarchie benötigen, können Sie einfach Folgendes verwenden:
2) Wenn Sie das Rad nicht neu erfinden und alle Felder einer Klassenhierarchie erhalten möchten, auf die Sie sich verlassen können Apache Commons Lang Version 3.2+, die bietet FieldUtils.getAllFieldsList:
import java.lang.reflect.Field;
import java.util.AbstractCollection;
import java.util.AbstractList;
import java.util.AbstractSequentialList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.Assert;
import org.junit.Test;
public class FieldUtilsTest {
@Test
public void testGetAllFieldsList() {
// Get all fields in this class and all of its parents
final List<Field> allFields = FieldUtils.getAllFieldsList(LinkedList.class);
// Get the fields form each individual class in the type's hierarchy
final List<Field> allFieldsClass = Arrays.asList(LinkedList.class.getFields());
final List<Field> allFieldsParent = Arrays.asList(AbstractSequentialList.class.getFields());
final List<Field> allFieldsParentsParent = Arrays.asList(AbstractList.class.getFields());
final List<Field> allFieldsParentsParentsParent = Arrays.asList(AbstractCollection.class.getFields());
// Test that `getAllFieldsList` did truly get all of the fields of the the class and all its parents
Assert.assertTrue(allFields.containsAll(allFieldsClass));
Assert.assertTrue(allFields.containsAll(allFieldsParent));
Assert.assertTrue(allFields.containsAll(allFieldsParentsParent));
Assert.assertTrue(allFields.containsAll(allFieldsParentsParentsParent));
}
}
@atk Niemand zwingt dich zu antworten; Aber für viele von uns, die auf diese Frage von Google stoßen, ist die beste Antwort eine weitaus prägnantere Erklärung als das Lesen langer Posts zum Nachdenken. Selbst die vielen Fragen wie diese tragen dazu bei, was SO heute ist.
– Angad
3. September 2015 um 8:07 Uhr
Siehe Wie lese ich ein privates Feld in Java?
– Martin Schröder
25. September 2015 um 9:23 Uhr