类加载器特技:OSGi代码生成
2010-03-01 00:00:00 来源:WEB开发网Enhancer仅仅针对桥接模式。代码生成逻辑被具体化到一个可插拔的Generator中。该Generator接收一个上下文类加载器,从中可以得到类,使用反射来驱动代码生成。增强类名称的文本协议也可以通过Name接口插拔。这里是一个最终的示意性代码,展示这么一个增强类框架是如何使用的:
...
/* Setup the Enhancer on top of the framework class space */
ClassLoader privateSpace = getClass().getClassLoader();
Namer namer = ...;
Generator generator = ...;
Enhancer enhancer = new Enhancer(privateSpace, namer, generator);
...
/* Enhance some class the app sees */
Bundle app = ...
Class target = app.loadClass("com.acme.devices.SinisterEngine");
Class<SinisterDevice> enhanced = enhancer.enhance(target);
...
这里展示的Enhance框架不仅是伪代码。实际上,在撰写这篇文章期间,这个框架被真正构建出来并用两个在同一OSGi容器中同时运行的样例代码生成器进行了测试。结果是类加载正常,现在代码在Google Code上,所有人都可以拿下来研究。
对于类生成过程本身感兴趣的人可以研究这两个基于ASM的生成器样例。那些在service dynamics上阅读文章的人也许注意到proxy generator使用ServiceHolder代码作为一个私有实现。
结论
这里展现的类加载特技在许多OSGi之外的基础框架中使用。例如桥接类加载器被用在Guice,Peaberry中,Spring Dynamic Modules则用桥接类加载器来使他们的AOP包装器和服务代理得以工作。当我们听说Spring的伙计们在将Tomcat适配到OSGi方面做了大量工作时,我们可以推断他们还得做类加载位置转换或者更大量的重构来外化Tomcat的servlet加载。
更多精彩
赞助商链接