轉載:http://www.cnblogs.com/luotaoyeah/p/3778183.htmlhtml
動態代理java
代理模式是 Java 中的經常使用設計模式,代理類經過調用被代理類的相關方法,提供預處理、過濾、過後處理等服務,動態代理及經過反射機制動態實現代理機制。JDK 中的 java.lang.reflect.Proxy 類能夠用來實現動態代理。設計模式
首先,準備一個簡單的接口和實現類ide
/** * 接口 IHello.java */ public interface IHello { void hello(); }
/** * 實現類 Hello.java */ public class Hello implements IHello { @Override public void hello() { System.out.println("我是Hello."); } }
經過 Proxy 實現動態代理spa
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.junit.Test; public class HelloTest { @Test public void testProxy() throws Exception { final IHello hello = new Hello(); /* * proxyHello : 代理主題角色,代理類的實例 * IHello : 抽象主題角色,代理類和被代理類都須要實現的接口,JDK中的動態代理必須針對接口 * hello : 真實主題角色,被代理類的實例 */ IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] { IHello.class }, new InvocationHandler() { /* * @param proxy : 當前代理類的一個實例; 若在invoke()方法中調用proxy的非final方法,將形成無限循環調用. */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 前置的業務邏輯操做 System.out.println("---開始"); // 調用被代理類的方法,傳入參數args,獲得返回 Object object = method.invoke(hello, args); // 後置的業務邏輯操做 System.out.println("---結束"); return object; } }); proxyHello.hello(); } }