我们知道Java里面有一个类java.lang.reflect.Proxy能实现所谓的动态代理,其核心思想是在运行时动态生成一个类,该类继承了 java.lang.reflect.Proxy,实现了指定接口。该类将对于接口方法的调用都动态分派到一个所谓的Handler那儿去,开发者可以实 现自己的Handler,截获调用,进行面向方面的处理。因此动态代理这个功能往往用来实现AOP方面的功能。
这个动态类是利用虚拟机生成的。知道动态代理的原理之后,我们完全可以自己实现这样一个动态代理,只要生成该类的class文件的内存映象即可。现在网上 由许多这种修改类或者干脆生成类的Java字节码的工具,其中Apache网站的cglib以及它依赖的项目BCEL都可以实现,但是这些类库的缺陷是太 过庞大,依赖其他第三方类库的地方太多,造成可实用不是太强,这是现Java开源项目的一个通病。
ObjectWeb上面有个项目叫ASM(含义是Java字节码的汇编语言)。它是一个Java字节码修改框架,能直接生成二进制类代码或者动态修改类代 码,生成stub类或者其他类似代理类。ASM要比BCEL和SERP小的多,其核心部分才33KB,速度也要比这些工具快的多,大概要比BCEL快7 倍,比SERP快11倍。由于ASM设计的目的就是在运行时使用,因此它的体积尽可能小,速度尽可能快。
动态代理有一个很好的用处就是生成调用stub,截获类调用,添加一些横向功能。这在EJB容器、Web容器等应用服务器实现时尤其有用。采用这种接口, 你可以简单的实现面向方面的功能,比如添加安全、事务、日志、过滤、编码、解码等等的功能,而且是纯粹热插拔的模式。总之使用动态代理能够实现许多AOP 方面的功能。
(常州欣才java培训机构 http://www.thinksite.cn/list-114-1.html)