2011-10-24 16 views
13

Voglio definire un metodo intercettore in un programma Java, in altre parole, voglio avere un comportamento che viene eseguito ad ogni chiamata di metodo. Questa applicazione non viene eseguita in un server delle applicazioni e pertanto non posso utilizzare l'EJB intorno agli intercettori. Ho trovato un bel Proxy API nelle librerie standard di Java, ma la sua limitata perché ha bisogno di un'interfaccia per la creazione di proxy:Proxy dinamico per classi di calcestruzzo

Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), 
             new Class[] { Foo.class }, 
             handler); 

C'è un'API simile che non costringa Foo.class essere dichiarate come un'interfaccia?

risposta

7

Perché non utilizzare CGLIB? Vedere this article per ulteriori informazioni.

E se si desidera eseguire il proxy delle classi legacy che non dispongono di interfacce? È possibile utilizzare CGLIB. CGLIB è una potente libreria ad alte prestazioni con codice . Sotto la copertina, utilizza ASM, una piccola ma veloce struttura di manipolazione del codice byte per trasformare il codice byte esistente in generare nuove classi. CGLIB è più veloce dell'approccio dinamico JDK per il proxy . In sostanza, genera dinamicamente una sottoclasse per sovrascrivere i metodi non finali della classe proxy e collega i ganci su cui è attiva la chiamata agli interceptor definiti dall'utente.

+0

http://cglib.sourceforge.net/apidocs/net/sf/cglib/Enhancer.html – eliocs

+0

http://cglib.sourceforge.net/apidocs/net/sf/cglib/MethodInterceptor.html – eliocs

+0

Sono al CGLIB. La mia comprensione è che genera un binario di classe in memoria, ma il caricatore di classi esistente carica solo la classe dal file system, quindi come utilizza il proprio classloader? – Chao

1

Sfortunatamente non esiste questa API per le classi. Molti framework utilizzano librerie di generazione bytecode come CGLIB per raggiungere questo obiettivo.

1

Puoi provare una delle classi di derisione. L'approccio più semplice potrebbe essere quello di sottoclasse, la tua classe. Oppure è possibile utilizzare AOP per iniettare il codice di registrazione che si desidera.

0

sun.misc.ProxyGenerator può essere utilizzato per generare classi proxy e non controlla che le loro "interfacce" siano tutte interfacce. Il suo metodo generateClassFile ti fornisce il bytecode come un array di byte, che puoi salvare per collegare a build future o modificare con strumenti di terze parti.

Si noti che se una qualsiasi delle "interfacce" ha un metodo finale, si otterrà un errore quando si tenta di caricare la classe.

Problemi correlati