【发布时间】:2020-07-28 03:41:00
【问题描述】:
我正在从实现公共 API 接口的 JAR 中加载类。接口本身将保持不变,但与 API 关联的其他类可能会随着时间而改变。显然,一旦 API 发生变化,我们将不再能够支持使用旧版本编写的接口的实现。然而,一些接口方法提供了String 类型的简单元数据,我们可以假设它们永远不会改变,也永远不会依赖可能改变的 API 的其他部分。即使 API 发生变化,我也希望能够提取此元数据。
例如,考虑以下可能加载的实现,其中Foo 是接口,Bar 是 API 中的另一个类。即使Bar 类不再存在,我也想调用name 方法。
class MyFoo implements Foo {
Bar bar = null;
@Override public String name() {
return "MyFoo"
}
}
据我所知,显而易见的方法是在我的自定义 ClassLoader 中覆盖 loadClass(String name) 并为 Bar 返回一些“假”类。可以假设元数据方法永远不会创建或使用Bar 对象。问题是当被要求加载Bar 时如何生成这个“假”类。我考虑过以下方法:
- 只需返回任何旧的现有类。我尝试返回
Object.class,但是当我尝试实例化Foo的实例时,这仍然会导致Bar的NoClassDefFoundError。 - 使用 ASM 从头开始为新类生成字节码。
- 使用 ASM 重命名某种空模板类以匹配
Bar并加载它。
2. 和 3. 似乎都很复杂,所以我想知道是否有更简单的方法来实现我的目标?
【问题讨论】:
标签: java jar classloader noclassdeffounderror java-bytecode-asm