Java 動態(tài)代理原理分析
Java 動態(tài)代理原理分析
概要
AOP的攔截功能是由java中的動態(tài)代理來實現(xiàn)的。說白了,就是在目標類的基礎上增加切面邏輯,生成增強的目標類(該切面邏輯或者在目標類函數(shù)執(zhí)行之前,或者目標類函數(shù)執(zhí)行之后,或者在目標類函數(shù)拋出異常時候執(zhí)行。Spring中的動態(tài)代理是使用Cglib進行實現(xiàn)的。我們這里分析的是JDK中的動態(tài)代理實現(xiàn)機制。
下面我們通過例子快速了解JDK中的動態(tài)代理實現(xiàn)方式。
示例
需要代理的接口
public interface IHello {
public void sayHello();
}
需要代理的類
public class HelloImpl implements IHello {
public void sayHello() {
System.out.println(“Hello World…”);
}
}
調(diào)用處理器實現(xiàn)類
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
public Object proxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println(“aspect before … “);
Object result = method.invoke(this.target, args);
System.out.println(“aspect after … “);
return result;
}
}
測試類入口
public class Main {
public static void main(String[] args) {
ProxyHandler proxy = new ProxyHandler(new HelloImpl());
IHello hello = (IHello) proxy.proxyInstance();
hello.sayHello();
}
}
Proxy 源碼解析
newProxyInstance() 方法
省略了不關心的代碼
public static Object newProxyInstance(ClassLoader loader, Class c){
}
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
基于Java實現(xiàn)簡單的時序數(shù)據(jù)壓縮算法
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)簡單易懂的時序數(shù)據(jù)壓縮算法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-06-06
javaCV開發(fā)詳解之推流器和錄制器的實現(xiàn)
這篇文章主要介紹了javaCV開發(fā)詳解之推流器和錄制器實現(xiàn),對JavaCV感興趣的同學,可以參考下2021-04-04

