Maison >Java >javaDidacticiel >Explication détaillée du mode proxy dynamique Java

Explication détaillée du mode proxy dynamique Java

高洛峰
高洛峰original
2017-02-07 13:31:191292parcourir

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

Explication détaillée du mode proxy dynamique Java

3. Simulez l'implémentation du proxy dans Mybatis

Classe MapperProxy

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;
 }
 
}

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

Explication détaillée du mode proxy dynamique JavaCe 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 !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn