java - mvc - Proxy dinámico para clases concretas
spring java tutorial (4)
sun.misc.ProxyGenerator se puede usar para generar clases proxy y no verifica que sus "interfaces" sean todas 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.
Quiero definir un interceptor de método en un programa Java; en otras palabras, quiero tener un comportamiento que se ejecute en cada llamada de 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 una buena Proxy API en las bibliotecas estándar de Java pero es limitada porque necesita una interfaz en la creación del proxy:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
handler);
¿Hay una API similar que no obligue a Foo.class a declararse como interfaz?
¿Por qué no usar CGLIB ? Vea este artículo para más información.
¿Qué sucede si desea usar proxy de clases heredadas que no tienen interfaces? Puedes usar CGLIB. CGLIB es una potente biblioteca de generación de código de alto rendimiento. Debajo de la cubierta, usa ASM, un marco de manipulación de bytecode pequeño pero rápido, para transformar el código de bytes existente y generar nuevas clases. CGLIB es más rápido que el enfoque de proxy dinámico JDK. Básicamente, genera dinámicamente una subclase para anular los métodos no finales de la clase de proxy y conecta los enlaces que devuelven la llamada a los interceptores definidos por el usuario.
Lamentablemente, no hay tal API para las clases. Muchos marcos están utilizando bibliotecas de generación de códigos de bytes como CGLIB para lograr esto.
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.