Le mode proxy utilise l'objet proxy pour compléter la demande de l'utilisateur et bloque l'accès de l'utilisateur à l'objet réel.
Le mode proxy a de nombreuses utilisations, comme pour des raisons de sécurité, il est nécessaire de bloquer le client d'accéder directement à l'objet réel; ou dans les appels distants, l'objet proxy doit être utilisé pour gérer les détails techniques dans la méthode distante; ou afin d'améliorer le système, l'objet réel est encapsulé pour atteindre le but du chargement retardé.
Lorsque le système démarre, la séparation de la méthode qui consomme le plus de ressources à l'aide du mode proxy peut accélérer la vitesse de démarrage du système et réduire le temps d'attente de l'utilisateur. Lorsque l'utilisateur fait réellement une requête, la classe proxy charge ensuite la classe réelle pour terminer la demande de l'utilisateur. C'est le but d'utiliser le mode proxy pour obtenir un chargement paresseux.
1. Implémentation de proxy statique:
Interface de sujet:
Interface publique idbquery {string request (); } Sujet réel:
La classe publique DBQuery implémente idbQuery {public dbQuery () {try {Thread.Sleep (10000); } catch (exception e) {e.printStackTrace (); }} Public String request () {return "string request"; }} Classe de procuration:
La classe publique IdBQueryProxy implémente idbquery {private dbQuery dbQuery; Public String request () {if (dbQuery == null) dbQuery = new dbQuery (); return dbQuery.Request (); }} Enfin, la fonction principale:
classe publique ProxyText {public static void main (String [] args) {idbquery dbQuery = new idbQueryProxy (); System.out.println (dbQuery.Request ()); }}NOTE STATIQUE STATIQUE QUE LA CLASSE DE PROXY est une interface commune pour les classes réelles à mettre en œuvre, et la classe Proxy fait référence aux objets de classe réel et met des opérations longues dans la méthode de la classe proxy pour l'implémenter.
Proxy dynamique:
Le proxy dynamique est en cours d'exécution, génère dynamiquement des classes de proxy. C'est-à-dire que le bytecode de la classe proxy est généré et chargé au moment de l'exécution. Par rapport aux agents statiques, les agents dynamiques n'ont pas besoin de faire attention à encapsuler une classe d'encapsulation complètement identique à des fins réelles. S'il existe de nombreuses interfaces de sujet, il est ennuyeux d'écrire une méthode de proxy pour chaque interface. Si l'interface change, la classe réelle et la classe de proxy doivent être modifiées, ce qui n'est pas propice à la maintenance du système; Deuxièmement, les méthodes de génération de certains agents dynamiques peuvent même être exécutées à l'exécution, qui est une logique d'exécution de classe de procuration spécifiée, améliorant ainsi considérablement la flexibilité du système.
Interface de sujet:
Interface publique idbquery {string request (); } Classe de proxy JDK:
La classe publique JDBDBQueryHandler implémente InvocationHandler {idbQuery idbquery = null; @Override public objet invoke (proxy objet, méthode de la méthode, objet [] args) lance throwable {if (idbquery == null) {idbquery = new dbQuery (); } return idbquery.request (); } public static idbquery createjdbproxy () {idbquery jdkproxy = (idbquery) proxy.newproxyinstance (classloader.getSystemClassLoader (), new class [] {idbquery.class}, new JDBDBQuelerler ()); System.out.println ("jdbdbqueryhandler.createjdbproxy ()"); retourner jdkproxy; }} Fonction principale:
classe publique ProxyText {public static void main (String [] args) {idbquery idbquery = jdbdbqueryhandler.createjdbproxy (); System.out.println (idbquery.request ()); }}De plus, vous pouvez également utiliser le proxy dynamique CGLIB et Javassist pour être similaire au proxy dynamique JDK, mais le processus de création de la classe dynamique JDK est le plus rapide, car la méthode DifineClass () intégrée est définie comme une implémentation native, donc ses performances sont meilleures que les autres. Dans les appels de fonction des classes de proxy, le proxy dynamique de JDK n'est pas aussi bon que le proxy dynamique CGLIB et Javassist, tandis que Javassist Dynamic Proxy a la pire qualité de performance et est encore pire que la mise en œuvre de JDK. Dans les applications de développement réelles, la méthode appelant la fréquence de la classe de proxy est beaucoup plus élevée que la fréquence de génération réelle de la classe de proxy, de sorte que la méthode appelant les performances du proxy dynamique devrait devenir au centre des performances. JDK Dynamic Proxy oblige que les classes de proxy et les sujets réels implémentent les interfaces unifiées, et le proxy dynamique CGLIB et Javassist n'ont pas de telles exigences.
Dans Java, l'implémentation de proxy dynamique implique l'utilisation de Classloader. Prenant l'exemple de CGLIB, une brève description du processus de chargement des classes dynamiques est décrite. En utilisant CGLIB pour générer un proxy dynamique, vous devez d'abord générer une instance de la classe Enhancer et formuler une classe de rappel pour gérer les activités de proxy. Dans la méthode Enhancer.Create (), le bytecode de la classe proxy sera généré à l'aide de la méthode defaultGeneratorstrategy.generate () et enregistrée dans le tableau d'octets. Puis appelez les réflectUtils.deFineClass (), et via la réflexion, appelez la méthode classloader.deFineClass () pour charger le bytecode dans le classloader pour compléter le chargement de la classe. Enfin, via la méthode ReflefleTutils.NewInstance (), une instance de classe dynamique est générée par réflexion et l'instance est renvoyée. D'autres sont différents des détails du processus, mais la logique de génération est la même.
Ce qui précède concerne cet article, j'espère qu'il sera utile à l'apprentissage de tout le monde.