Cet article organise des points de connaissance pour les agents dynamiques Java, le contenu spécifique est le suivant
1. Java Dynamic Proxy (déclaration officielle comparative)
Le modèle proxy est un modèle de conception Java couramment utilisé. Sa caractéristique est que la classe proxy et la classe de délégués ont la même interface. La classe proxy est principalement responsable de la prétraitement des messages, du filtrage des messages, du transfert des messages à la classe du délégué et du traitement des messages après l'événement. Il existe généralement une association entre la classe proxy et la classe du délégué. L'objet d'une classe de proxy est associé à l'objet d'une classe de délégué. L'objet de la classe proxy lui-même n'implémente pas vraiment le service, mais fournit des services spécifiques en appelant les méthodes pertinentes de l'objet de classe de délégué.
Selon la période de création d'agent, les classes d'agent peuvent être divisées en deux types.
Proxy statique: créé par les programmeurs ou génère automatiquement le code source par des outils spécifiques et le compile. Avant que le programme ne s'exécute, le fichier .class de la classe proxy existe déjà.
Proxy dynamique: il est créé dynamiquement à l'aide d'un mécanisme de réflexion lorsque le programme est en cours d'exécution.
2. Implémentation de proxy dynamique
java.lang.reflect.proxy,
Proxy fournit des méthodes statiques pour créer des classes et des instances de proxy dynamiques.
newproxyinstance ()
Renvoie une instance de la classe proxy de l'interface spécifiée qui peut attribuer des appels de méthode au gestionnaire d'appels spécifié.
2.1. Interface DAO (fournit l'interface de calque d'accès aux données simulées)
package javaproxy; / * * Définir une interface de couche d'accès aux données * / interface publique Dao {// Simuler les données enregistrer le public void Save ();} 2.2. Classe de mise en œuvre de la classe Daoimpl
package javaproxy; classe publique DaoIMPl implémente dao {@Override public void Save () {System.out.println ("Exécuter une méthode de sauvegarde ................"); }} 2.3. Classe de traitement des agents
package javaproxy; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; classe publique daohandler implémente invocationhandler {objet privé obj; public daohandler (objet obj) {this.obj = obj;} @Override Object Invoke (proxy objet, méthode de méthode, objet [] args) lance {System.out.println ("Do quelque chose avant la méthode"); // le pré-méthode est simulé ici args); System.out.println ("faire quelque chose après la méthode"); // Le post-méthode d'AOP est simulé ici return ret; }} 2.4. Appel client
package javaproxy; import java.lang.reflect.proxy; classe publique Client {public static void main (String [] args) {// metaObject (objet proxé) daoIMPl daoIMPl = new DaoImpl (); // Business Proxy Class DaoHandler DaoHandler = new DaoHandler (DaoImpl); Dao dao = (dao) proxy.newProxyInstance (daoImpl .getClass (). GetClassLoader (), daoImpl.getClass () .getInterfaces (), daOhandler); dao.save (); }}2. 5. Résultats
3. Simuler l'implémentation de proxy dans Mybatis
3.1. Classe de mappenproxy
package javaproxy; importer java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; classe publique Mappeproxy implémente invocationhandler {@suppresswarning @param: exécuter la méthode avec sqlSession * * @return: return proxy objet * / public static <T> t newmapperProxy (class <t> MAPPERInterface, objet sqlSession) {classloader classloader = mappeinterface.getClassloadher (); Class <?> [] Interfaces = new class [] {MAPPERINTERACE}; Proxy mappeproxy = new Mappeproxy (); return (t) proxy.newproxyinstance (classloader, interfaces, proxy); } / * * (non javadoc) * * @see java.lang.reflect.invocationhandler # invoke (java.lang.object, * java.lang.reflect.method, java.lang.object []) * * @param: objet proxy * * @param: la méthode trouve la méthode correspondante par le nom de la méthode * * @Param: Passon Trouvez la carte des paramètres correspondante * * @return: renvoyez l'objet de paramètre exécuté * / objet public invoquer (proxy d'objet, méthode de la méthode, objet [] args) lance Throwables {// ici, l'opération correspondante est effectuée en analysant le mappeur correspondant à travers le nom de la méthode et les paramètres System.out.println ("Exécuter la méthode réelle ici"); retourner null; }} 3.2. Client
package javaproxy; import java.lang.reflect.proxy; Client de classe publique {public static void main (string [] args) {dao dao = mappeproxy.newmapperproxy (dao.class, null); dao.save (); }}3.3. Résultats
Ce qui précède est un exemple d'utilisation du proxy dynamique JDK. J'espère qu'il sera utile pour tout le monde d'apprendre la programmation Java.