JAVA动态代理和CGLIB简单介绍和使用
上一篇我们介绍了代理的一些基本概念和一个静态代理的例子。
这一章我们先讨论一下动态代理。
让我们还延续上一章理财的例子。
上回书说到我把我的积蓄交给了理财经理之后,我就安心在家数钱就好了。
时间来到2015年,不知道朋友们有没有见过千股跌停,很荣幸,笔者见过。
这时候赶紧把钱取出来,重新考虑理财方式。
从朋友处听说基金的风险比较低。创建基金交易类,也实现理财接口,代码实例如下
于是我又去找到理财经理,帮我买基金吧,但是理财经理犯难了,我没有基金操作的经验啊。那怎么办呢?难道我们换一个经理吗?如果以后买期货怎么办呢?再换一个吗?要是有一个人能按照我的要求替我选好经理就好了。
这时候动态代理应运而生。Java提供了静态方法Proxy.newInstance来创建动态代理,利用的是反射机制来完成。
上代码,创建动态交易代理类。可以根据我们的需求动态的找到(创建)不同的经理。
可以看出,动态代理创建类的方法,代码也是很少的。
下面我们就可以自由的切换理财模式了,只需要把要求告诉动态代理就可以了。
这样做简直太方便了。但是有一点需要注意,那就是JAVA提供的动态代理能创建的类是有一个条件的,那就是这个类必须实现了某一个接口。
如果我们要访问的对象没有实现某一个接口,又不能直接访问,还想动态创建对象,怎么办呢?CGLIB可以帮我们解决。
CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。
这也是CGLIB比JDK的代理类的强大之处,不只可以实现接口,还可以扩展类,解决了有的类由于没有实现接口而无法被动态代理的问题。
另外,CGLIB底层封装了ASM,通过对字节码的操作来生成类,具有更高的性能。
这里简单介绍一下ASM。ASM是一套JAVA字节码生成架构,能够动态生成.class文件并在加载进内存之前进行修改,如果大家感兴趣,以后单独再写一篇。
首先,使用CGLIB需要引用JAR包cglib-nodep-3.2.5.jar(如果引入cglib.jar,还需要引入asm的jar包)。
废话不多说,让我们看看使用CGLIB来完成本例中的动态代理来怎么实现。
创建CGLIB动态代理类,Enhancer类来创建被代理的对象,intercept方法拦截所有的对象方法。
当然,这只是CGLIB应用的一部分,其实还为我们提供了很多的功能,以后碰到的话再做一次详细的分析,到这里,代理就告一段落了。下一篇将会继续更新深入理解JAVA虚拟机的笔记。
喜欢文章或想一起学习的朋友可以关注我,我将会持续更新,有什么疑问或文中有不当之处请给我留言,真诚地希望能与大家一起交流探讨,学习进步。在收藏的同时能给我点个赞,感激不尽。