Ho una classe e voglio trovare tutti i suoi campi pubblici (non metodi). Come posso fare questo?
Grazie!
Risposte:
Field[] fields = YourClassName.class.getFields();
restituisce un array di tutte le variabili pubbliche della classe.
getFields()
restituire i campi in tutta la classe-eredità. Se vuoi avere i campi definiti solo nella classe in questione, e non le sue superclassi, usa getDeclaredFields()
e filtra public
quelli con il seguente Modifier
approccio:
Modifier.isPublic(field.getModifiers());
Il YourClassName.class
letterale rappresenta effettivamente un oggetto di tipo java.lang.Class
. Controlla i suoi documenti per metodi di riflessione più interessanti.
La Field
classe sopra è java.lang.reflect.Field
. Puoi dare un'occhiata all'intero java.lang.reflect
pacchetto.
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html dispone anche di grafici per l'individuazione di metodi e costruttori.
Puoi utilizzare uno dei due in base alle tue necessità:
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.
Per filtrare solo i campi pubblici dall'elenco precedente (in base ai requisiti) utilizzare il codice seguente:
List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
Collectors.toList());
Come accennato da pochi utenti, il codice riportato di seguito può aiutare a trovare tutti i campi in una determinata classe.
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));
}
}
Tuttavia un approccio più interessante è di seguito:
Con l'aiuto della libreria Jackson, sono stato in grado di trovare tutte le proprietà della classe di tipo String / integer / double e i rispettivi valori in una classe Map. ( senza usare le riflessioni api! )
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());
}
}