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虚拟机的笔记。

喜欢文章或想一起学习的朋友可以关注我,我将会持续更新,有什么疑问或文中有不当之处请给我留言,真诚地希望能与大家一起交流探讨,学习进步。在收藏的同时能给我点个赞,感激不尽。


猜你喜欢

转载自blog.csdn.net/wuyuwuqiu/article/details/80475249