Maison >Java >javaDidacticiel >Explication détaillée du mode proxy dynamique Java
Cet article organise les points de connaissances sur le proxy dynamique Java. Le contenu spécifique est le suivant
1 Proxy dynamique JAVA (déclaration plus officielle)
Le mode proxy est un modèle de conception Java couramment utilisé, et. sa caractéristique est proxy La classe a la même interface que la classe déléguée.La classe proxy est principalement responsable du prétraitement des messages pour la classe déléguée, du filtrage des messages, de la transmission des messages à la classe déléguée et du traitement ultérieur des messages. Il existe généralement une association entre une classe proxy et une classe déléguée. Un objet d'une classe proxy est associé à un objet d'une classe déléguée. L'objet de la classe proxy lui-même n'implémente pas réellement le service, mais en appelant les méthodes appropriées. de l’objet de la classe déléguée. Fournir des services spécifiques.
En fonction de la période de création de l'agent, la classe d'agent peut être divisée en deux types.
Proxy statique : Créé par des programmeurs ou généré automatiquement par des outils spécifiques, puis compilé. Avant l'exécution du programme, le fichier .class de la classe proxy existe déjà.
Proxy dynamique : créé dynamiquement à l'aide du 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 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 (fournissant une interface de couche d'accès aux données simulée)
package javaproxy; /* * 定义一个数据访问层接口 */ public interface Dao { //模拟数据保存 public void save(); }
2.2. Classe d'implémentation de classe DaoImpl
package javaproxy; public class DaoImpl implements Dao{ @Override public void save() { System.out.println("执行一个保存方法。。。。。。。。。。。。"); } }
2.3. Classe de traitement des agents
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. Appel client
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. Résultat
3. Simulez l'implémentation du proxy dans MybatisClasse MapperProxypackage 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; } }Client <.>
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(); } }
3.3. Résultat
Ce qui précède est un exemple d'utilisation du proxy dynamique JDK. J'espère qu'il sera utile à tout le monde d'apprendre la programmation Java.
Pour des articles plus détaillés sur le mode proxy dynamique Java, veuillez faire attention au site Web PHP chinois !