Post

Visualizzazione dei post con l'etichetta java.lang.Reflect

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&

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