2016-02-19 33 views
0

我正在使用Equinox Transforms在類路徑中用它的自定義版本替換一個類。轉換機制似乎正常工作,我返回我的變壓器類的public InputStream getInputStream(InputStream inputStream, URL transformerUrl)的自定義類的InputStream使用Eclipse轉換另一個類轉換:無法修復ClassFormatError

但是,該類的加載會導致ClassFormatError帶有消息Truncated class file。我能夠想象的唯一原因是Java版本之間的不匹配,但是我已經盡了一切我知道如何去消除這個問題的根源,但都無濟於事。

我在Installed JREs首選項中從Eclipse中除去了一個JDK。我確保所涉及的所有插件的執行環境都具有相同的Java版本,並且構建路徑上的JRE在相同的執行環境中指定。目標和產品執行環境的定義也相同。我在工作區做了一個clean all,並重新啓動了eclipse和我的運行時工作臺多次,其中-clean。畢竟,我仍然得到錯誤。

如果不是Java版本導致此錯誤,還能有什麼? Equinox Transforms頁面說,它可以用來轉換類資源。有沒有人真的這樣做?

+0

這個項目的最新提交是2013年,它似乎被放棄.. –

+0

是的,我注意到了。但它被記錄爲工作。可能有些東西我不懂加載類,因爲春分代碼似乎在做它應該做的。 – MidnightJava

+0

你應該嘗試一下在osgi中重寫類的「標準」方法:weavinghook https://osgi.org/javadoc/r6/core/org/osgi/framework/hooks/weaving/WeavingHook.html –

回答

2

有一個更標準化的方式來替換osgi中的一個類,通過WeavingHook。這個鉤子應該被註冊爲一個服務,並且可以動態地增強一個類。

請參閱the WeavingHook JavadocAries Proxy的具體示例,它們藉助於asm(WovenProxyGenerator)動態創建代理。

+0

謝謝,這是比使用通用鉤子擴展創建我自己的變換更容易的方法。我最初遇到了一個問題,因爲我得到了替換類的字節。我最初在插件中嘗試編織:InputStream is = Activator.class.getClassLoader()。getResourceAsStream(「/」+「qualified.class.name」.replaceAll(「\\。」,「/」) +「.class」);我認爲它會解決當前項目中的替換類,但它實際上解決了第三方插件中的原始類。 – MidnightJava

+0

這工作:InputStream是=新的URL(「platform:/plugin/my.plugin.name/bin/path/to/replacement/class。」)。openConnection()。getInputStream(); – MidnightJava