Post

Visualizzazione dei post con l'etichetta Java Reflection

Recuperare programmaticamente i campi di un oggetto

DOMANDA: Come posso recuperare tutti i campi di un oggetto programmaticamente? RISPOSTA: Per recuperare tutti gli attributi/campi di un oggetto è sufficiente usare la Reflection di Java con un po' di ricorsione.  Definiamo una classe User con delle proprietà: package lancill.objectfields.pojo; import java.util.List; public class User extends Person{ private String mail; private String userid; private List<String> contacts; private List<User> friends; public User(){} public User(String name){ super(name); } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public List<String> getContacts() { return contacts; } public void setContacts(List<String> contacts) { this.contacts = contacts; } public List<User> getFriends() { return friends; } p

Java Reflection: accesso a metodi e campi privati

DOMANDA: Come si può accedere da un classe generica ai metodi e alle variabili di istanza private di un'altra classe? RISPOSTA: Genericamente non è possibile accedere ai campi o metodi privati  di un'altra classe. Ma g enericamente non vuol dire in modo assoluto! Infatti, grazie alla Reflection Java possiamo accedere ai campi privati di un'altra classe. Analizziamo alcuni metodi che ci mette a disposizione la classe java.lang.Class : getFields() : permette di recuperare la lista di tutti i campi pubblici della classe e della sua superclasse; getDeclaredFields() : fornisce la lista di tutti i campi presenti nella classe (senza distinzione di visibilità); getDeclaredMethods() : come sopra ma applicato ai metodi; getDeclaredField(String nome) : restituisce il Field indicato come parametro (senza distinzione di visibilità); getDeclaredMethos(String nome) : restituisce il Method indicato come parametro (senza distinzione di visibilità). Guardiamo l&

Java Reflection: come richiamare array di classi

DOMANDA: Ho seguito le istruzioni dell' altro post sulla Java Reflection e stavo modificando la classe RinominaFile in modo che avesse un costruttore aggiuntivo che prende in input come parametri due array di stringhe come nell'esempio qui di seguito: package reflection; import java.io.File; public class RinominaFile {     private String[] pathFrom;     private String[] newName;     public RinominaFile(String pathFrom, String newName) {       this .pathFrom[0] = pathFrom;       this .newName[0] = newName;    }     public RinominaFile(String[] pathFrom, String[] newName){       this .pathFrom = pathFrom;       this .newName = newName;    }    public void rinomina() {       for ( int i=0; i<pathFrom.length; i++){          File fromFile = new File(pathFrom[i]);          fromFile.renameTo( new File(newName[i]));       }    } } Così ho modificato la classe di Test: package reflection; import java.lang.reflect.Constructor; import java.lang.refle

Eseguire una classe a Runtime con Java Reflection

DOMANDA: Sto creando un programma che ha bisogno di lanciare dei metodi di altre classi Java a runtime. Come posso fare? RISPOSTA: L'idea che mi viene in mente è Java Reflection , una caratteristica potentissima di Java che permette di ottenere a runtime molte informazioni sulle classi (metodi e parametri, costruttori, attributi, ecc..., ecc...). Vediamo con l'esempio TestReflection come ispezionare una classe: package reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class TestReflection {     public static void main(String[] args) throws ClassNotFoundException {       // la classe da analizzare       String classeDaInvocare = "java.lang.String" ;       Class classeInvocata = Class.forName(classeDaInvocare);           // elenco dei parametri dei vari costruttori       Constructor[] costruttori = classeInvocata.getConstructors();       for (Constructor c: costruttori){          Class[] parame