2010-01-24 18 views

risposta

94
Field[] fields = YourClassName.class.getFields(); 

restituisce una matrice di tutte le variabili pubbliche della classe.

getFields() restituire i campi nell'intera classe-heirarcy. Se si desidera avere i campi definiti soltanto nella classe in questione, e non le sue superclassi, utilizzare getDeclaredFields(), e filtrare i public quelli con il seguente Modifier approccio:

Modifier.isPublic(field.getModifiers()); 

Il YourClassName.class letterale in realtà rappresenta un oggetto di tipo java.lang.Class. Controlla i suoi documenti per metodi di riflessione più interessanti.

La classe sopra Field è java.lang.reflect.Field. Puoi dare un'occhiata all'intero pacchetto java.lang.reflect.

+2

solo una nota: inizialmente la mia risposta conteneva un'affermazione errata, tuttavia è stata sovralimentata un numero di volte. Si prega di leggere più attentamente;) – Bozho

+1

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

+0

questa soluzione è lenta? o possiamo usarlo liberamente? –

1

Come menzionato da pochi utenti, sotto il codice può aiutare a trovare tutti i campi di 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 è qui di seguito:

Con l'aiuto di Jackson biblioteca, sono stato in grado di trovare tutte le proprietà di classe di tipo stringa/integer/doppia, e rispettivi valori in una classe Map. (senza utilizzare riflessi 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()); 
    } 
} 
3

È possibile utilizzare uno dei due in base alle proprie esigenze:

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 dalla lista di cui sopra (sulla base del requisito) utilizzare il codice qui sotto:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList()); 
Problemi correlati