El modo proxy utiliza el objeto proxy para completar la solicitud del usuario y bloquea el acceso del usuario al objeto real.
El modo proxy tiene muchos usos, como por razones de seguridad, es necesario bloquear al cliente para acceder directamente al objeto real; o en llamadas remotas, el objeto proxy debe usarse para manejar detalles técnicos en el método remoto; o para mejorar el sistema, el objeto real está encapsulado para lograr el propósito de la carga retrasada.
Cuando se inicia el sistema, separar el método que consume la mayoría de los recursos utilizando el modo proxy puede acelerar la velocidad de inicio del sistema y reducir el tiempo de espera del usuario. Cuando el usuario realmente está haciendo una consulta, la clase proxy luego carga la clase real para completar la solicitud del usuario. Este es el propósito de usar el modo proxy para lograr una carga perezosa.
1. Implementación de proxy estática:
Interfaz de tema:
interfaz pública idbQuery {String request (); } Tema real:
Public Class DBQuery implementa IdbQuery {public dbQuery () {try {Thread.sleep (10000); } catch (Exception e) {E.PrintStackTrace (); }} solicitud de cadena pública () {return "String Solicitud"; }} Clase proxy:
Public Class IdbQueryProxy implementa IdbQuery {private dbQuery dbQuery; Solicitud de cadena pública () {if (dBQuery == null) dBquery = new dBQuery (); return dbQuery.request (); }} Finalmente, la función principal:
public class proxyText {public static void main (string [] args) {idbQuery dbQuery = new IdBQueryProxy (); System.out.println (dBQuery.Request ()); }}El proxy estático, tenga en cuenta que la clase proxy es una interfaz común para que las clases reales lo implementen, y la clase proxy se refiere a objetos de clase reales, y coloca operaciones que requieren mucho tiempo en el método de clase proxy para implementarlo.
Proxy dinámico:
El proxy dinámico es cuando se ejecuta, genera dinámicamente clases proxy. Es decir, el código de byting de la clase proxy se genera y se carga en tiempo de ejecución. En comparación con los agentes estáticos, los agentes dinámicos no necesitan tener cuidado de encapsular una clase de encapsulación completamente idéntica para el propósito real. Si hay muchas interfaces de temas, es molesto escribir un método proxy para cada interfaz. Si la interfaz cambia, tanto la clase real como la clase proxy deben cambiarse, lo que no es propicio para el mantenimiento del sistema; En segundo lugar, los métodos de generación de algunos agentes dinámicos se pueden ejecutar en tiempo de ejecución, que es una lógica de ejecución de clase proxy especificada, mejorando en gran medida la flexibilidad del sistema.
Interfaz de tema:
interfaz pública idbQuery {String request (); } Clase de proxy JDK:
clase pública JDBDBQueryHandler implementa InvocationHandler {IdBQuery IdBQuery = null; @Override Public Object Invoke (Object Proxy, Método Método, Object [] args) lanza lando {if (idbQuery == null) {idbQuery = new dBQuery (); } return idbQuery.request (); } public static idbquery createjdbproxy () {idbQuery jdkproxy = (idbQuery) proxy.newproxyInstance (classLoader.getSystemClassLoader (), nueva clase [] {idbQuery.class}, new JDBDBQueryHandler ()); System.out.println ("JDBDBQueryHandler.CreateJdbProxy ()"); return jdkproxy; }} Función principal:
public class proxyText {public static void main (string [] args) {idbQuery idbQuery = jdbdbqueryHandler.createJdbProxy (); System.out.println (idbQuery.request ()); }}Además, también puede usar el proxy dinámico CGLIB y Javassist para que sea similar al proxy dinámico JDK, pero el proceso de creación de la clase dinámica JDK es el más rápido, porque el método DiFinecLass () incorporado se define como una implementación nativa, por lo que su rendimiento es mejor que otros. En las llamadas de función de las clases de proxy, el proxy dinámico de JDK no es tan bueno como CGLIB y Javassist Dynamic Proxy, mientras que Javassist Dynamic Proxy tiene la peor calidad de rendimiento, y es aún peor que la implementación de JDK. En las aplicaciones de desarrollo reales, la frecuencia de llamadas del método de la clase proxy es mucho más alta que la frecuencia de generación real de la clase proxy, por lo que el método que llama el rendimiento del proxy dinámico debería convertirse en el foco del rendimiento. El proxy dinámico JDK exige que las clases de proxy y los temas reales implementan interfaces unificadas, y el proxy dinámico CGLIB y Javassist no tiene tales requisitos.
En Java, la implementación de proxy dinámico implica el uso de clases cargadores. Tomando CGLIB como ejemplo, se describe una breve descripción del proceso de carga de las clases dinámicas. Usando CGLIB para generar proxy dinámico, primero debe generar una instancia de la clase de potenciador y formular una clase de devolución de llamada para manejar el negocio proxy. En el método mejor.create (), el código bytecodo de la clase proxy se generará utilizando el método predeterminado GeneratorStrategy.Generate () y se guardará en la matriz de bytes. Luego llame al método reflectutilils.defineClass (), y a través de la reflexión, llame al método de clase de clase.defineClass () para cargar el bytecode en el cargador de clases para completar la carga de la clase. Finalmente, a través del método de reflectutil.newinstance (), se genera una instancia de clase dinámica por reflexión y se devuelve la instancia. Otros son diferentes de los detalles del proceso, pero la lógica de generación es la misma.
Lo anterior se trata de este artículo, espero que sea útil para el aprendizaje de todos.