我使用Equinox Transforms将一个类替换为类路径上的自定义版本。转换机制似乎工作正常,我从变换器类的InputStream
返回自定义类的public InputStream getInputStream(InputStream inputStream, URL transformerUrl)
。
但是加载该类后会产生ClassFormatError
消息Truncated class file
。我唯一可以想象的是Java版本之间的不匹配,但是我已经完成了我知道怎么做以消除它作为问题根源的一切,但无济于事。
我在Installed JREs首选项中从Eclipse中删除了除Eclipse之外的所有JDK。我确保所涉及的所有插件的执行环境都具有相同的Java版本,并且构建路径上的JRE使用相同的执行环境指定。目标和产品执行环境的定义也相同。我在工作区中做了一个clean all
,并用-clean
多次重新启动了eclipse和我的运行时工作台。毕竟,我仍然得到错误。
如果没有Java版本导致此错误,还有什么其他内容? Equinox Transforms页面表示它可用于转换类资源。有没有人真的这样做过?
答案 0 :(得分:2)
有一种更标准化的方法可以通过WeavingHook
替换osgi中的类。此挂钩应该注册为服务,并且可以动态增强类。
请参阅the WeavingHook Javadoc或Aries Proxy的具体示例,它在asm(WovenProxyGenerator)的帮助下动态创建代理。