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){ }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!