動態代理
代理模式是 Java 中的常用設計模式,代理類通過調用被代理類的相關方法,提供預處理、過濾、事后處理等服務,動態代理及通過反射機制動態實現代理機制。JDK 中的 java.lang.reflect.Proxy 類可以用來實現動態代理。
首先,准備一個簡單的接口和實現類
1 /** 2 * 接口 IHello.java 3 */ 4 public interface IHello { 5 void hello(); 6 }
1 /** 2 * 實現類 Hello.java 3 */ 4 public class Hello implements IHello { 5 @Override 6 public void hello() { 7 System.out.println("我是Hello."); 8 } 9 }
通過 Proxy 實現動態代理
1 import java.lang.reflect.InvocationHandler; 2 import java.lang.reflect.Method; 3 import java.lang.reflect.Proxy; 4 5 import org.junit.Test; 6 7 public class HelloTest { 8 @Test 9 public void testProxy() throws Exception { 10 final IHello hello = new Hello(); 11 12 /* 13 * proxyHello : 代理主題角色,代理類的實例 14 * IHello : 抽象主題角色,代理類和被代理類都需要實現的接口,JDK中的動態代理必須針對接口 15 * hello : 真實主題角色,被代理類的實例 16 */ 17 IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 18 new Class[] { IHello.class }, new InvocationHandler() { 19 20 /* 21 * @param proxy : 當前代理類的一個實例; 若在invoke()方法中調用proxy的非final方法,將造成無限循環調用. 22 */ 23 @Override 24 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 25 26 // 前置的業務邏輯操作 27 System.out.println("---開始"); 28 29 // 調用被代理類的方法,傳入參數args,得到返回 30 Object object = method.invoke(hello, args); 31 32 // 后置的業務邏輯操作 33 System.out.println("---結束"); 34 35 return object; 36 } 37 }); 38 39 proxyHello.hello(); 40 } 41 }