Antworten:
Field[] fields = YourClassName.class.getFields();
Gibt ein Array aller öffentlichen Variablen der Klasse zurück.
getFields()
Geben Sie die Felder in der gesamten Klassenerbschaft zurück. Wenn Sie möchten, dass die Felder nur in der betreffenden Klasse und nicht in ihren Oberklassen definiert werden, verwenden getDeclaredFields()
und filtern Sie die Felder public
mit dem folgenden Modifier
Ansatz:
Modifier.isPublic(field.getModifiers());
Das YourClassName.class
Literal repräsentiert tatsächlich ein Objekt vom Typ java.lang.Class
. Weitere interessante Reflexionsmethoden finden Sie in den Dokumenten.
Die Field
obige Klasse ist java.lang.reflect.Field
. Sie können sich das gesamte java.lang.reflect
Paket ansehen .
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html enthält auch Diagramme zum Auffinden von Methoden und Konstruktoren.
Sie können je nach Bedarf eine der beiden Optionen verwenden:
Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.
Verwenden Sie den folgenden Code, um nur die öffentlichen Felder aus der obigen Liste (basierend auf den Anforderungen) zu filtern:
List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
Collectors.toList());
Wie von wenigen Benutzern erwähnt, kann der folgende Code dazu beitragen, alle Felder in einer bestimmten Klasse zu finden.
TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
String name=method.getName();
if(name.startsWith("get"))
{
System.out.println(name.substring(3));
}else if(name.startsWith("is"))
{
System.out.println(name.substring(2));
}
}
Ein interessanterer Ansatz ist jedoch unten:
Mit Hilfe der Jackson-Bibliothek konnte ich alle Klasseneigenschaften vom Typ String / integer / double und die entsprechenden Werte in einer Map-Klasse finden. ( ohne Reflexionen API zu verwenden! )
TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();
Map<String,Object> props = m.convertValue(testObject, Map.class);
for(Map.Entry<String, Object> entry : props.entrySet()){
if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
}