首頁  >  文章  >  Java  >  詳解java動態代理模式

詳解java動態代理模式

高洛峰
高洛峰原創
2017-02-07 13:31:191274瀏覽

本文針對java動態代理進行知識點整理,具體內容如下

一. JAVA的動態代理(比較官方說法) 
  代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的接口,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類別與委託類別之間通常會存在關聯關係,一個代理類別的物件與一個委託類別的物件關聯,代理類別的物件本身並不真正實現服務,而是透過呼叫委託類別的物件的相關方法,來提供特定的服務。 
  依照代理的創建時期,代理類別可以分為兩種。 
  靜態代理程式:由程式設計師建立或特定工具自動產生原始程式碼,再進行編譯。在程式運行前,代理類別的.class檔案就已經存在了。 
  動態代理:在程式運作時,運用反射機制動態創建而成。

二. 動態代理實作

  java.lang.reflect.Proxy,
  Proxy 提供用於建立動態代理類別和實例的靜態方法.
  newProxyInstance()
  方法呼叫指派到指定的呼叫處理程序。

 2.1. Dao介面(提供類比資料存取層介面)

package javaproxy;
/*
 * 定义一个数据访问层接口
 */
public interface Dao {
 //模拟数据保存
public void save();
}

2.2. DaoImpl類實作類別

package javaproxy;
  
public class DaoImpl implements Dao{
  
 @Override
 public void save() {
  System.out.println("执行一个保存方法。。。。。。。。。。。。");
    
 }
  
}

2.3. 代理處理類別

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.3. 代理處理類別

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

cli

2. 5 . 結果

詳解java動態代理模式

3. 模擬Mybatis中的代理實作

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

3.2. Client是使用JDK動態代理的例子,希望對大家學習java程式設計有幫助。

更多詳解java動態代理模式相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn