Dieser Artikel organisiert Wissenspunkte zum dynamischen Java-Proxy. Der spezifische Inhalt lautet wie folgt: 1. JAVA-Dynamik-Proxy (offizielle Aussage)
Der Proxy-Modus ist ein häufig verwendetes Java-Entwurfsmuster Sein Merkmal ist Proxy. Die Klasse verfügt über dieselbe Schnittstelle wie die Delegate-Klasse. Die Proxy-Klasse ist hauptsächlich für die Vorverarbeitung von Nachrichten für die Delegate-Klasse, das Filtern von Nachrichten, das Weiterleiten von Nachrichten an die Delegate-Klasse und die anschließende Verarbeitung von Nachrichten verantwortlich. Normalerweise besteht eine Assoziation zwischen einer Proxy-Klasse und einer Delegate-Klasse. Das Objekt der Proxy-Klasse selbst implementiert den Dienst nicht, sondern durch den Aufruf der entsprechenden Methoden des Objekts der Delegate-Klasse bestimmte Dienste bereitstellen. Basierend auf dem Erstellungszeitraum des Agenten kann die Agentenklasse in zwei Typen unterteilt werden.
Statischer Proxy: Von Programmierern erstellt oder automatisch von bestimmten Tools generiert und dann kompiliert. Bevor das Programm ausgeführt wird, ist die .class-Datei der Proxy-Klasse bereits vorhanden.
Dynamischer Proxy: Wird mithilfe des Reflexionsmechanismus dynamisch erstellt, wenn das Programm ausgeführt wird.
2. Dynamische Proxy-Implementierung
java.lang.reflect.Proxy,
Proxy stellt statische Methoden zum Erstellen dynamischer Proxy-Klassen und -Instanzen bereit. newProxyInstance()
Gibt zurück eine Proxy-Klasseninstanz der angegebenen Schnittstelle, die dem angegebenen Aufrufhandler Methodenaufrufe zuweisen kann.
2.1. Dao-Schnittstelle (Bereitstellung einer simulierten Datenzugriffsschichtschnittstelle)
package javaproxy; /* * 定义一个数据访问层接口 */ public interface Dao { //模拟数据保存 public void save(); }
package javaproxy; public class DaoImpl implements Dao{ @Override public void save() { System.out.println("执行一个保存方法。。。。。。。。。。。。"); } }
2.3. Agentenverarbeitungsklasse
package javaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DaoHandler implements InvocationHandler{ private Object obj; public DaoHandler(Object obj) { this.obj=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("do something before method");//这里模拟AOP的前置方法 Object ret = method.invoke(this.obj, args); System.out.println("do something after method");//这里模拟AOP的后置方法 return ret; } }
2.4. Kundenanruf
package javaproxy; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { // 元对象(被代理对象) DaoImpl daoImpl = new DaoImpl(); // 业务代理类 DaoHandler daoHandler=new DaoHandler(daoImpl); Dao dao=(Dao) Proxy.newProxyInstance(daoImpl .getClass().getClassLoader(), daoImpl.getClass() .getInterfaces(), daoHandler); dao.save(); } }
2. Ergebnis
3. Simulieren Sie die Proxy-Implementierung in Mybatis
3.1. MapperProxy-Klasse
package javaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MapperProxy implements InvocationHandler { @SuppressWarnings("unchecked") /* * 这里通过静态方法得到实现类的对象 * * @param:接口 * * @param:用sqlsession执行方法 * * @return: 返回代理对像 */ public static <T> T newMapperProxy(Class<T> mapperInterface, Object sqlSession) { ClassLoader classLoader = mapperInterface.getClassLoader(); Class<?>[] interfaces = new Class[] { mapperInterface }; MapperProxy proxy = new MapperProxy(); 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:代理对象 * * @param:方法通过方法名字找到对应的方法 * * @param:通过方法传入对象找到对应的传递参数映射 * * @return:返回执行后的参数对象 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 这里通过方法名字以及参数通过解析对应的mapper来执行对应的操作 System.out.println("在这里执行实际方法"); return null; } }
3.2 🎜>
3.3. Ergebnis
package javaproxy; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { Dao dao=MapperProxy.newMapperProxy(Dao.class, null); dao.save(); } }
Das Obige ist ein Beispiel für die Verwendung des dynamischen JDK-Proxys.
Ausführlichere Artikel zum dynamischen Java-Proxy-Modus finden Sie auf der chinesischen PHP-Website!