2011-10-24 8 views
13

Quiero definir un interceptor de método en un programa Java, en otras palabras, quiero tener un comportamiento que se ejecute en cada llamada al método. Esta aplicación no se ejecuta en un servidor de aplicaciones y, por lo tanto, no puedo usar el EJB para invocar interceptores. he encontrado un buen Proxy API en las bibliotecas estándar de Java, pero su limitado debido a que necesita una interfaz en la creación de proxy:Proxy dinámico para las clases concretas

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

¿Existe una API similar que no obligue a Foo.class para ser declarado como una interfaz?

Respuesta

7

¿Por qué no utilizar CGLIB? Vea this article para más información.

¿Qué sucede si desea utilizar las clases heredadas de proxy que no tienen interfaces? Puede usar CGLIB. CGLIB es una potente biblioteca de generación de código de alto rendimiento . Debajo de la cubierta, usa ASM, una pequeña pero rápida estructura de manipulación de códigos de bytes , para transformar el código de bytes existente a genera nuevas clases. CGLIB es más rápido que el enfoque de proxy dinámico JDK . Esencialmente, genera dinámicamente una subclase para anular los métodos no finales de la clase de proxy y conecta los enlaces que devuelven a los interceptores definidos por el usuario.

+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

Soy nuevo a CGLIB. Según entiendo, genera un binario de clase en la memoria, pero el cargador de clases existente solo carga la clase del sistema de archivos, entonces, ¿cómo usa su propio cargador de clases? – Chao

1

Lamentablemente, no existe dicha API para las clases. Muchos marcos están utilizando bibliotecas de generación de códigos de bytes como CGLIB para lograr esto.

1

Puedes probar una de las clases de burlas. El enfoque más simple puede ser subclase, tu clase. O podría usar AOP para inyectar el código de registro que desea.

0

sun.misc.ProxyGenerator se puede utilizar para generar clases de proxy y no comprueba que sus "interfaces" son todas las interfaces. Su método generateClassFile le proporciona el bytecode como una matriz de bytes, que puede guardar para vincular en versiones futuras o modificar con herramientas de terceros.

Tenga en cuenta que si alguna de las "interfaces" tiene un método final, recibirá un error cuando intente cargar la clase.

Cuestiones relacionadas