1. 程式人生 > >java中動態代理的使用

java中動態代理的使用

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

下面我們通過例項來展示動態代理在java程式中的簡單應用。

這是我們示例的整體架構,由介面、實現類、代理類和測試類組成。

我們先定義一個介面類,也是我們需要代理的類。

package com.wenbing.proxyreflect;

public interface OrderService {

    int sum(int total);

    Long getPrice(int size);

}

建立我們被代理類的實現類。

package com.wenbing.proxyreflect;

public class OrderServiceImpl implements OrderService {
    @Override
    public int sum(int total) {
        
return total*10; } @Override public Long getPrice(int size) { return size*30L; } }

建立代理類,實現InvocationHandler介面。

package com.wenbing.proxyreflect;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

//代理類
public class Proxy implements InvocationHandler {

// 需要代理的目標 private Object target; // 使用構造方法傳入需要代理的目標 public Proxy(Object target) { this.target = target; } /** * 橫切面邏輯 * * @param proxy 產生代理的例項 * @param method 需要代理的方法 * @param args 方法引數 * @return 代理方法的返回值 * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 方法執行前的業務 System.out.println("方法執行前的業務"); // 使用反射執行方法 Object result = method.invoke(target, args); System.out.println(result); // 方法執行後的業務 System.out.println("方法執行後的業務"); return result; } }

建立測試類Test,通過動態代理的方法去完成方法的呼叫獲取結果。

package com.wenbing.proxyreflect;

import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args) throws Exception {
        OrderServiceImpl orderService = new OrderServiceImpl();

//        獲取代理
        OrderService os = (OrderService) Proxy.newProxyInstance(Test.class.getClassLoader(), orderService.getClass().getInterfaces(), new com.wenbing.proxyreflect.Proxy(orderService));
        Long price = os.getPrice(10);
        System.out.println("價格為:"+price);
        System.out.println("=========================");
        int sum = os.sum(5);
        System.out.println(sum);
    }

}

這個小例子非常簡單,很適合入門去理解動態代理的小白,自己跟著程式碼敲一遍將受益匪淺。

紙上得來終覺淺,絕知此事要躬行,趕緊跟著敲一敲吧。