動態代理能夠作什麼?好比說spring的AOP,它就是以動態代理爲基礎實現的,AOP攔截須要的請求,而後經過代理把請求的結果返回到AOP代理類中,在代理類裏就能夠作不少本身想要作的事情,好比日誌記錄,請求參數記錄等
java
首先動態代理須要三個實現類,一個測試類spring
接口HelloInterface
ide
接口實現類HelloInterfaceImpl測試
動態代理類HelloDynamicProxythis
測試類HelloTestspa
代碼具體實現代理
HelloInterface日誌
/** * Created by liuhj on 2015/12/28. */ public interface HelloInterface { public void say(); }
HelloInterfaceImplcode
/** * Created by liuhj on 2015/12/28. */ public class HelloInterfaceImpl implements HelloInterface { @Override public void say() { System.out.println("Hello"); } }
HelloDynamicProxyorm
要實現InvocationHandler接口
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class HelloDynamicProxy implements InvocationHandler{ private Object target; /** * @param target * @return */ public Object bind(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override /** * */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; System.out.println("BEGIN"); result=method.invoke(target, args); System.out.println("END"); return result; } }
HelloTest
public class TestProxy { public static void main(String[] args) { HelloDynamicProxy proxy = new HelloDynamicProxy(); HelloInterface helloProxy = (HelloInterface) proxy.bind(new HelloInterfaceImpl()); helloProxy.say(); } }
輸出結果
BEGIN Hello END
到此結束了
動態代理和靜態代理的區別就是代理中,靜態代理是以組合的方式注入到代理類,動態代理則是以反射機制注入到代理類。
才疏學淺,若有錯誤敬請指出,謝謝。