Dieser Artikel organisiert Wissenspunkte für Java Dynamic Agents, der spezifische Inhalt lautet wie folgt
1. Java Dynamic Proxy (vergleichende offizielle Erklärung)
Das Proxy -Modell ist ein häufig verwendetes Java -Designmodell. Seine Eigenschaft ist, dass die Proxy -Klasse und die Delegierteklasse die gleiche Schnittstelle haben. Die Proxy -Klasse ist hauptsächlich für die Vorverarbeitung von Nachrichten, die Filtern von Nachrichten, die Weiterleitungen von Nachrichten an die Delegierklasse und die Verarbeitung von Nachrichten nach dem Ereignis verantwortlich. In der Regel besteht ein Zusammenhang zwischen der Proxy -Klasse und der Delegiertenklasse. Das Objekt einer Proxy -Klasse ist dem Objekt einer Delegiertenklasse zugeordnet. Das Objekt der Proxy -Klasse selbst implementiert den Dienst nicht wirklich, sondern bietet spezifische Dienste, indem sie die relevanten Methoden des Delegiertenklassenobjekts aufrufen.
Nach der Erstellung von Agenten können Agentenklassen in zwei Arten unterteilt werden.
Statischer Proxy: Erstellt von Programmierern oder generiert automatisch Quellcode nach bestimmten Tools und kompiliert ihn. Bevor das Programm ausgeführt wird, gibt es bereits die .class -Datei der Proxy -Klasse.
Dynamischer Proxy: Es wird dynamisch unter Verwendung des Reflexionsmechanismus erstellt, wenn das Programm ausgeführt wird.
2. Dynamische Proxy -Implementierung
java.lang.reflect.proxy,
Proxy bietet statische Methoden zum Erstellen von dynamischen Proxy -Klassen und -Instanzen.
NewProxyInstance ()
Gibt eine Instanz der Proxy -Klasse der angegebenen Schnittstelle zurück, mit der Methodenaufrufe dem angegebenen Anrufhandler zugewiesen werden können.
2.1. DAO -Schnittstelle (bietet eine simulierte Datenzugriffsschichtschnittstelle)
Paket Javaproxy;/** Definieren Sie eine Datenzugriffsschichtschnittstelle*/öffentliche Schnittstelle dao {// Simulieren von Datensparen für öffentliche void save ();} 2.2. DaoImpl -Klassen -Implementierungsklasse
Paket Javaproxy; public class DaoImpl implementiert dao {@Override public void Save () {System.out.println ("Eine Speichermethode ausführen ................"); }} 2.3. Agentenverarbeitungsklasse
Paket Javaproxy; Import Java.lang.reflect.InvocationHandler; Import Java.lang.reflect.Method; public class daohandler implements invocationHandler {private Object obj; public DaoHandler (Objekt obj) {this.obj = obj;} @Override öffentliches Objekt Invoke (Objektproxy, Methode Methode, Object [] args) wirft Throwable {system.out.println ("Do etwas vor der Methode aus. args); System.out.println ("etwas nach Methode tun"); // Der Post-Methode von AOP wird hier simuliert. }} 2.4. Client -Anruf
Paket Javaproxy; importieren java.lang.reflect.proxy; public class Client {public static void main (String [] args) {// metaObject (Proxed -Objekt) DaoImpl daoImpl = new DaoImpl (); // Business Proxy -Klasse Daohandler Daohandler = New DaOHandler (Daoimpl); Dao dao = (dao) proxy.newProxyInstance (Daoimpl .getClass (). GetClassloader (), Daoimpl.getClass () .getInterfaces (), Daohandler); Dao.Save (); }}2. 5. Ergebnisse
3. Simulieren Sie die Proxy -Implementierung in MyBatis
3.1. Mapperproxy -Klasse
Paket javaproxy; import Java.lang.reflect.invocationHandler; Import Java.lang.reflect.methode; importieren java.lang.reflect.proxy; public class mapperproxy implementiert implementiert invocationHandler {@Suppresswarnings ("Unangecounted"). Methode mit SQLSession ausführen** @return: Proxy -Objekt zurückgeben*/ public static <T> t NewmapperProxy (Klasse <T> mapperinterface, Objekt SQLSession) {classloader classLoader = mapPerInterface.getClassLoader (); Klasse <?> [] Interfaces = new class [] {mapperinterface}; Mapperproxy proxy = new mapperproxy (); return (t) proxy.newproxyInstance (Classloader, Schnittstellen, Proxy); } /* * (non-Javadoc) * * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, * java.lang.reflect.Method, java.lang.Object[]) * * @param: proxy object* * @param: method finds the corresponding method through the method name* * @param: pass the object into the object through the method to Finden Sie die entsprechende Parameterkarte** @return: Geben Sie das ausgeführte Parameter -Objekt zurück*/ public Object invoke (Objektproxy, Methode Methode, Object [] args) Throwable {// Hier wird die entsprechende Operation durchgeführt, indem der entsprechende Mapper durch den Methodennamen und den Parameter system analysiert wird. null zurückkehren; }} 3.2. Kunde
Paket Javaproxy; importieren java.lang.reflect.proxy; öffentliche Klasse Client {public static void main (String [] args) {dao dao = mapperproxy.newmapperproxy (dao.class, null); Dao.Save (); }}3.3. Ergebnisse
Das obige ist ein Beispiel für die Verwendung von JDK Dynamic Proxy. Ich hoffe, es wird für alle hilfreich sein, Java -Programme zu lernen.