1. 程式人生 > >詳解java動態代理模式

詳解java動態代理模式

引言:java框架中很多設計都是基於動態代理模式的,所謂動態代理模式,就是動態的產生目標物件的代理類,並規定一個方法,可以執行目標物件的方法,也可以在目標物件方法的基礎上新增其他必要的方法。這裡,詳細介紹一下java中實現動態代理模式的兩種方式

在java中,動態代理模式的實現有兩種方式:

  • 一種是基於JDK的方式
    基於JDK內建的實現方式要求目標物件(被代理物件)必須有介面,因為其是根據目標物件的介面來動態生成代理物件的。
    具體的步驟如下:
    1. 宣告一個類並實現InvocationHandler介面,在此類中指定目標物件,並指定代理行為
public class ComputerInvocationHandler
implements InvocationHandler {
//指定代理物件,可以傳入一切代理物件,代理物件是以介面的形式表示 private Object target; public ComputerInvocationHandler(Object object) { this.target = object; } /** * 指定代理行為 * @param proxy * @param method * @param args * @return * @throws Throwable */
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object res = method.invoke(target,args); return res; } }
2. 在另外一個類中(例如測試類) 建立一個目標物件
 //建立目標物件  自然是有一個Lenovo類,類中有一些自帶的方法
        Lenovo lenovo = new Lenovo();
3. 建立Invocation物件
//Handler物件
        ComputerInvocationHandler computerInvocationHandler = new ComputerInvocationHandler(lenovo);//這裡是建立Handler物件,其構造方法中需要傳被代理物件
4. 呼叫Proxy的newProxyInstance方法獲取代理物件
//介面指向實現類
        Computer computer = (Computer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(),lenovo.getClass().getInterfaces(),computerInvocationHandler);
5. 使用代理物件呼叫目標物件的方法
computer.sales();//computer中自帶有sales方法
  • 二是基於CGlib的

    • 基於CGlib的實現方式不要求目標物件有介面,但是需要根據目標物件產生一個子類作為代理物件
      實現步驟:
      1. 新增cglib的maven依賴
    <dependency>
         <groupId>cglib</groupId>
         <artifactId>cglib</artifactId>
         <version>3.2.5</version>
     </dependency>

    2.建立一個類,並實現methodInterceptor介面,在此類中指定代理行為

 public class MyMethodInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        return methodProxy.invokeSuper(o,objects);
    }
}

3.在需要代理的地方(例如測試類)中建立Enhance物件

Enhancer enhancer = new Enhancer();

4.指定父類物件(即目標物件)

//設定目標物件(父類)
        enhancer.setSuperclass(Mouse.class);

5.指定代理行為(MethodInterceptor的實現類)

//設定代理行為
        enhancer.setCallback(new MyMethodInterceptor());

6.建立實現類(目標物件的子類),執行方法

  Mouse mouse = (Mouse) enhancer.create();
  mouse.move();

總結:以上詳細介紹了java種兩種實現動態代理模式的方式及實現步驟希望對初學者有所幫助,關於設計模式,以後要多寫部落格,多做總結才行