使用 Eclipse Transforms 将 class 替换为另一个:无法修复 ClassFormatError

Replacing a class with another using Eclipse Transforms: can't fix ClassFormatError

我正在使用 Equinox Transforms 将 class 替换为 class 路径上的自定义版本。转换机制似乎工作正常,我 return 自定义 class 的 InputStream 来自我的转换器 class.

public InputStream getInputStream(InputStream inputStream, URL transformerUrl)

但是 class 的加载随后会导致带有消息 Truncated class fileClassFormatError。我能想到的唯一原因是 Java 版本之间的不匹配,但我已经尽我所能来消除它作为问题的根源,但无济于事。

我在已安装的 JRE 首选项中从 Eclipse 中删除了一个 JDK。我确保所有涉及的插件的执行环境都具有相同的 Java 版本,并且构建路径上的 JRE 指定了相同的执行环境。目标和产品执行环境的定义也相同。我在工作区中执行了 clean all 并重新启动了 eclipse 和我的运行时 workbench 多次,-clean。毕竟,我仍然得到错误。

如果不是 Java 版本导致此错误,还有什么可能? Equinox Transforms 页面说它可以用来转换 class 资源。有人真的这样做过吗?

在 osgi 中有一种更标准化的方法来替换 class,即 WeavingHook。此挂钩应注册为服务,并有可能动态增强 class.

参见 the WeavingHook Javadoc or a concrete example with Aries Proxy, which dynamically create proxies with the help of asm (WovenProxyGenerator)。