Java: ottieni tutti i nomi delle variabili in una classe


91

Ho una classe e voglio trovare tutti i suoi campi pubblici (non metodi). Come posso fare questo?

Grazie!


Dovresti essere in grado di farlo utilizzando l' API Reflection .
Crozin

Risposte:


134
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 publicquelli con il seguente Modifierapproccio:

Modifier.isPublic(field.getModifiers());

Il YourClassName.classletterale rappresenta effettivamente un oggetto di tipo java.lang.Class. Controlla i suoi documenti per metodi di riflessione più interessanti.

La Fieldclasse sopra è java.lang.reflect.Field. Puoi dare un'occhiata all'intero java.lang.reflectpacchetto.


2
solo una nota: inizialmente la mia risposta conteneva un'affermazione sbagliata, ma è stata votata più volte. Si prega di leggere più attentamente;)
Bozho

1
@downvoter - l'errore era prima. Se ne vedi uno adesso, per favore condividi.
Bozho

questa soluzione è lenta? o possiamo usarlo liberamente?
Dany Y

va bene. Ma non esagerare.
Bozho


15

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

2

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());
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.