2011-09-16 21 views
4

我有類Assembly實現IAssembly。IllegalAccessError:類<classname>無法訪問其超級界面<interfacename>

啓動應用程序時

Caused by: java.lang.IllegalAccessError: class <Assembly > cannot access its superinterface <IAssembly> 
     at java.lang.ClassLoader.defineClass1(Native Method) 

彙編代碼

class package.Assembly implements IAssembly { 

} 

IAssembly

interface IAssembly { //note -this is note public, so uses default protected 

} 

大會和IAssembly在兩個不同的罐子存在我看到下面的錯誤。兩個jar都由不同的類加載器加載。 Assembly類是在子類加載器中加載的,IAssembly是父類。類裝載機正在使用鏈接。

在正常情況下,這是有效的。在使用cobertura裝入罐子後運行我的應用程序時發生錯誤。沒有儀器,所有工作正常。 cobertura儀器會導致這樣的錯誤嗎?或者這是一個等待被發現的錯誤,但與cobertura錯誤很快就暴露出來了。

通過使接口「公開」,錯誤消失。

+1

爲什麼你需要使用不同的類加載器加載罐子?您的應用程序如何部署/運行?通常最好將所有東西打包在一起(對於簡單的應用程序),或者通過類似於EJB的JNDI和RMI來訪問。我親自把你的界面和你的班級放在同一個罐子裏。但那只是我。 –

+0

對我來說,這個消息導致了一個類路徑問題,其中一個'package_example'被定義爲這樣:'A/package_example/classA','B/package_example/classB'。當然,'A'和'B'必須位於類路徑中才能正常工作。 –

回答

4

在我看來,即使裝載機鏈接在一起,包裝保護在使用儀器和多個類裝入程序時也會失敗。上java.lang.instrument.Instrumentation這個javadoc不直接關係到你的情況,但它描述了一個類似的情景:

http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#appendToBootstrapClassLoaderSearch(java.util.jar.JarFile

也許檢查其裝載機是找到你的儀表類,看看是否有一種方式來獲得從同一個類加載器加載AssemblyIAssembly

1

我認爲你的問題可能是你沒有使用兼容版本的IAssembly。因此,即使它在你的類路徑中,接口和它的實現也不匹配。

如果這是一個類加載器的問題,你會得到一個NoClassDefFoundError。

+0

每個班級只有一個版本。 – Jayan

相關問題