Ho bisogno di metodi proxy su varie classi di vista nel framework dell'interfaccia utente Android come TextView
. In particolare TextView#setText(int resId)
. Questo metodo non fa parte di un'interfaccia. Pertanto, Java Proxy non funzionerà poiché funziona solo per le interfacce. Ho bisogno di usare la manipolazione bytecode.Metodo finale proxy in Classe non finale
Ho trovato una libreria chiamata dexmaker che sembrava promettente. Sto assumendo che ho bisogno di fare la manipolazione del codice byte di runtime in quanto le classi di Visualizzazione Android sono effettivamente disponibili sul dispositivo. Dexmaker può proxy metodi pubblici su classi concrete. Poi ho notato che TextView#setText(int resId)
è inspiegabilmente final. La classe TextView
non è definitiva.
Penso che potrei fare in modo che dexmaker supporti i metodi finali nelle classi non finali. È possibile? Non voglio iniziare questo progetto se non lo è. Sarebbe una grande vittoria per la mia libreria anche se gli sviluppatori non avrebbero bisogno di sottoclassi, interfacce o chiamate di metodi statici manuali per le loro viste. La mia biblioteca deve sapere quando il testo è impostato su una vista particolare. Un proxy è il modello di design perfetto per questo.
Colpo casuale (poiché non è menzionato): Un influsso di layout consente di [impostare una classe di fabbrica] (http://developer.android.com/reference/android/view/LayoutInflater. html # setFactory2 (android.view.LayoutInflater.Factory2)) potrebbe essere quello che stai cercando. Questo è usato in [probe] (https://github.com/lucasr/probe/) dove la fabbrica crea dinamicamente dei proxy usando dexmaker per intercettare le chiamate. –
Parte della mia biblioteca utilizza effettivamente la tecnica di fabbrica del gonfiaggio del layout. Stai dicendo che puoi configurare un proxy lì sugli oggetti vista creati tramite dexmaker? – jophde
Grazie mille Stefan. La fonte Probe è esattamente ciò di cui avevo bisogno :). Se ho capito correttamente Probe crea classi View completamente nuove, quindi la limitazione del Proxybuild di dexmaker di non essere in grado di gestire i metodi finali non è un problema? Da Dexmaker ProxyBuilder doc: "Questo processo funziona solo per le classi con livello di visibilità pubblico e protetto." – jophde