In quest’articolo vedremo come usare la Java Reflection per effettuare operazioni sugli attributi di una classe.
Tutto questo avviene tramite la classe java.lang.reflect.Field Java. Nello specifico in quest’articolo tratteremo le seguenti operazioni:
- Ottenere gli attributi di una classe
- Ottenere il nome di un attributo
- Ottenere il tipo di un attributo
- Get/set di un attributo
OTTENERE GLI ATTRIBUTI DI UNA CLASSE
Per ottenere gli attributi di una classe si parte recuperando la classe dell’oggetto ad esempio facendo un MyClass.class dove MyClass è la nostra classe di cui vogliamo ottenere gli attributi:
Class aClass = MyClass.class Field[] fields = aClass.getFields();
L’array Field[] avrà tanti istanze Field per ogni attributo pubblico dichiarato nella classe.
Se si conosce il nome dell’attributo ad esempio “myField” si può accedere ad esso in questo modo:
Class aClass = MyClass.class Field field = aClass.getField("myField");
L’esempio riportato sopra restituirà un’istanza Field corrispondente all’attributo myField come dichiarato nella class MyClass in basso:
public class MyClass { public String myField = null; }
Se passiamo un nome non presente fra gli attributi di classe, il metodo getField() solleverà una eccezione di tipo NoSuchFieldException.
OTTENERE il nome di un attributo
Una volta ottenuta l’istanza Field si può recuperare il suo nome tramite il metodo getName(), come in basso:
Field field = aClass.getField("myField"); String fieldName = field.getName();
OTTENERE IL tipo DI UN ATTRIBUTO
Possiamo determinare il tipo dell’attributo (String, int etc.) usando il metodo getType():
Field field = aClass.getField("myField"); Object fieldType = field.getType();
Get/set di un attributo
Una volta ottenuta l’istanza Field si può facilmente effettuare get/set dei suoi valori in questo modo:
Class aClass = MyClass.class Field field = aClass.getField("myField"); MyClass objectInstance = new MyClass(); field.set(objetInstance, "some string"); // set String value = field.get(objectInstance); // get
Il parametro objectInstance passato ai metodi get e set deve essere una istanza della classe in esame. Nell’esempio superiore è usata un’istanza della classe MyClass e l’attributo myField è un attributo della stessa.