Java 动态代理原理分析
Java动态代理原理分析
概要
AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。Spring中的动态代理是使用Cglib进行实现的。我们这里分析的是JDK中的动态代理实现机制。
下面我们通过例子快速了解JDK中的动态代理实现方式。
示例
需要代理的接口
publicinterfaceIHello{
publicvoidsayHello();
}
需要代理的类
publicclassHelloImplimplementsIHello{
publicvoidsayHello(){
System.out.println(“HelloWorld…”);
}
}
调用处理器实现类
publicclassProxyHandlerimplementsInvocationHandler{
privateObjecttarget;
publicProxyHandler(Objecttarget){
this.target=target;
}
publicObjectproxyInstance(){
returnProxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
System.out.println(“aspectbefore…“);
Objectresult=method.invoke(this.target,args);
System.out.println(“aspectafter…“);
returnresult;
}
}
测试类入口
publicclassMain{
publicstaticvoidmain(String[]args){
ProxyHandlerproxy=newProxyHandler(newHelloImpl());
IHellohello=(IHello)proxy.proxyInstance();
hello.sayHello();
}
}
Proxy源码解析
newProxyInstance()方法
省略了不关心的代码
publicstaticObjectnewProxyInstance(ClassLoaderloader,Classc){
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!