JDK动态代理及cglib动态代理实现分析
代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问,动态代理使得开发人员无需手工编写代理类便可动态地获得代理类,下面就JDK动态代理与CGLIB动态代理展开分析。
1、JDK动态代理分析
JDK动态代理依靠接口实现,所以仅支持实现了接口的动态代理,下面用一个常用的JDK动态代理实现进行分析
实现InvocationHandler实现调用处理器
InvocationHandlerImpl.java
定义UserService接口,并实现此接口UserServiceImpl
UserServiceImpl.java
编写一个测试类进行测试
JDKDynamicProxyTest.java
运行可得结果
至此JDK动态代理实现完成。
可以看到动态代理类是由java.lang.reflect.Proxy.newProxyInstance生成的,那么Proxy到底为我们生成了什么样的代理类呢?接下来通过源代码来了解一下Proxy到底是如何实现的,JDK的安装目录中均有源码src.zip。
关键代码
由上可以看到生成代理类的方法,所以在Test类中将代理类生成,Test类改为
JDKDynamicProxyTest.java
在C盘根目录下生成了动态的代理类class,使用反编译工具查看关键代码如下
可以看到,生成的代理类继承了Proxy类并实现了UserService接口,而实现接口的方法中使用调用处理器的方法,处理器h则在构造方法中传入了return (Object) cons.newInstance(new Object[] { h }); 即生成的代理类中调用了InvocationHandler方法。
简单来说生成的代理类中,每一个实现接口的方法均调用InvocationHandler的方法invoke,完成代理的逻辑。
2、CGLIB动态代理分析
JDK动态代理只能代理实现了接口的类,若需代理的类未实现任何接口,则需要使用CGLIB生成代理类
同样首先由简单的实现进行分析
编写一个未实现任何接口的类AccountServiceImpl
AccountServiceImpl.java
创建类MethodInterceptorImpl实现了CGLIB方法拦截器接口MethodInterceptor
MethodInterceptorImpl.java
编写一个测试类
CGLIBDynamicProxyTest.java
运行结果如下
更新中。。。
结束。
赞赏(Donation)
微信(Wechat Pay)