Este artículo organiza puntos de conocimiento para agentes dinámicos de Java, el contenido específico es el siguiente
1. Java Dynamic Proxy (declaración oficial comparativa)
El modelo proxy es un modelo de diseño Java de uso común. Su característica es que la clase proxy y la clase delegada tienen la misma interfaz. La clase proxy es el principal responsable del preprocesamiento de mensajes, filtrando mensajes, enviando mensajes a la clase delegada y procesar mensajes después del evento. Por lo general, hay una asociación entre la clase proxy y la clase delegada. El objeto de una clase proxy está asociado con el objeto de una clase delegada. El objeto de la clase proxy en sí no implementa realmente el servicio, sino que proporciona servicios específicos llamando a los métodos relevantes del objeto de clase delegada.
Según el período de creación de agentes, las clases de agentes se pueden dividir en dos tipos.
Proxy estático: creado por programadores o genera automáticamente el código fuente mediante herramientas específicas y lo compila. Antes de que se ejecute el programa, el archivo .class de la clase proxy ya existe.
Proxy dinámico: se crea dinámicamente utilizando el mecanismo de reflexión cuando el programa se está ejecutando.
2. Implementación dinámica de proxy
java.lang.reflect.proxy,
Proxy proporciona métodos estáticos para crear clases e instancias dinámicas de proxy.
NewProxyInstance ()
Devuelve una instancia de la clase proxy de la interfaz especificada que puede asignar llamadas de método al controlador de llamadas especificado.
2.1. Interfaz DAO (proporciona interfaz de capa de acceso a datos simulada)
paquete javaproxy;/** Definir una interfaz de la capa de acceso de datos*/interfaz pública dao {// simular datos guardando public void save ();} 2.2. Clase de implementación de la clase DAOIMPL
paquete javaproxi; La clase pública DaoImpl implementa Dao {@Override public void save () {System.out.println ("Ejecutar un método de guardado ................"); }} 2.3. Clase de procesamiento de agentes
paquete javaproxi; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; La clase pública DaoHandler implementa InvocationHandler {private object obj; public daoHandler (object obj) {this.obj = obj;} @Override Public Object Invoke (Object Proxy, Method Method, Object [] args) lanza lando {system.out.println ("do algo antes del método"); // El pre-metrodo de AOP está simulado aquí que se está simulando aquí el objeto RET = METODO. args); System.out.println ("hacer algo después del método"); // El post método de AOP se simula aquí return retir ret; }} 2.4. Llamada al cliente
paquete javaproxi; import java.lang.reflect.proxy; Cliente de clase pública {public static void main (string [] args) {// metaobject (objeto proxed) daoImpl daoImpl = new DaoImpl (); // clase comercial de proxy daohandler daohandler = new DaoHandler (daoImpl); Dao dao = (dao) proxy.newproxyInstance (daoImpl .getClass (). GetClassLoader (), daoImpl.getClass () .getInterfaces (), daoHandler); dao.save (); }}2. 5. Resultados
3. Simule la implementación del poder en MyBatis
3.1. Clase mapeador
paquete javaproxy; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; public class mapperproxy implementa invocationHandler {@supresswarningnings ("no comprobado"). @param: Ejecutar el método con SQLSession** @return: return proxy object*/ public static <t> t newMapperProxy (class <t> mapperinterface, object sqlsession) {classloader classLoader = mApperinterface.getClassLoader (); Clase <?> [] Interfaces = new class [] {mapperinterface}; MApperProxy proxy = nuevo mApperProxy (); return (t) proxy.newproxyInstance (classloader, interfaces, proxy); } / *) Encuentre el mapa de parámetros correspondiente** @return: return el objeto de parámetro ejecutado*/ public object Invoke (objeto proxy, método método, objeto [] args) lanza lando {// Aquí, la operación correspondiente se realiza mediante la analización del mapeador correspondiente a través del nombre del método y los parámetros System.Println ("ejecutar el método real aquí"); regresar nulo; }} 3.2. Cliente
paquete javaproxi; import java.lang.reflect.proxy; Cliente de clase pública {public static void main (string [] args) {dao dao = mapperproxy.newmapperproxy (dao.class, null); dao.save (); }}3.3. Resultados
Lo anterior es un ejemplo de uso de proxy dinámico JDK. Espero que sea útil para todos aprender la programación de Java.