类加载器特技:OSGi代码生成
2010-03-01 00:00:00 来源:WEB开发网适配器类加载器
有时候我们转换的代码有外部化的类加载策略。这意味着框架的类和方法接收明确的ClassLoader 参数,允许我们来决定他们从哪里加载应用代码。在这种情况下,把系统转换到OSGi就仅仅是让Bundle对象适配ClassLoader API的问题。这是一个经典的适配器模式的应用。
public class BundleClassLoader extends ClassLoader {
private final Bundle delegate;
public BundleClassLoader(Bundle delegate) {
this.delegate = delegate;
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
return delegate.loadClass(name);
}
}
现在我们可以把这个适配器传给转换的框架代码。随着新bundle的增减,我们还可以增加bundle跟踪代码来创建新的适配器 —— 例如,我们可以“在外部”把一个Java框架适配到OSGi,避免浏览该框架的代码库以及变换每个单独的类加载场所。下面是将一个框架转换到使用OSGi 类加载的示意性的例子:
...
Bundle app = ...
BundleClassLoader appLoader = new BundleClassLoader(app);
DeviceSimulationFramework simfw = ...
simfw.simulate("com.acme.devices.SinisterEngine", appLoader);
...
桥接类加载器
许多有趣的Java框架的客户端代码在运行时做了很多花哨的类处理工作。其目的通常是在应用的类空间中构造本不存在的类。让我们把这些生成的类称作增强(enhancement)。通常,增强类实现了一些应用可见的接口或者继承自一个应用可见的类。有时,一些附加的接口及其实现也可以被混入。
更多精彩
赞助商链接