java中動態代理的使用
阿新 • • 發佈:2018-12-19
代理模式是常用的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); } }
這個小例子非常簡單,很適合入門去理解動態代理的小白,自己跟著程式碼敲一遍將受益匪淺。
紙上得來終覺淺,絕知此事要躬行,趕緊跟著敲一敲吧。