兩種代理模式:java
jdk的動態代理是基於接口的動態代理,要求目標對象必須實現至少一個接口,核心API是java.lang.reflect.Proxy
類的newProxyInstance
方法。數組
Object proxy = Proxy.newProxyInstance( ClassLoader loader, Class[] interfaces, InvocationHandler handler );
返回值:接口的實現類對象ide
參數:代理
loader:類加載器對象code
interfaces:代理對象要實現的接口字節碼對象數組,一般寫成目標對象.getClass().getInterfaces()
對象
handler:代理類的方法裏,要執行的操做接口
一般是加強目標對象的方法或控制目標對象的方法get
是InvocationHandler接口的實現類,一般寫成匿名內部類形式io
new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //proxy:代理對象的引用,一般不用 //method:調用的方法對象 //args:調用的方法的參數 //result:調用代理對象時的返回值 return result; } }
cglib的動態代理是基於子類的動態代理,不須要目標對象實現接口,要求被代理類不能由final修飾.核心API是cglib.proxy.Enhancer
類的create
方法class
Enhancer.create(目標對象.getClass(), new MethodInterceptor() { /** * @param proxy:代理對象引用 * @param method:目標對象方法(經過它能夠訪問目標對象) * @param args:傳遞給目標對象的參數 * @MethodProxy methodProxy:代理對象的方法 * @return 返回值 * @throws Throwable */ public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //功能代碼 return result; } });
返回值:目標類的子類對象
參數: