2011-05-30 17 views
10

我正在使用自定義類加載器加載類。在大多數情況下,一切正常,但有時當我加載特別複雜的項目/庫,我得到一個奇怪的錯誤:ClassLoader.defineClass引發的ClassCircularityError

Exception in thread "main" java.lang.ClassCircularityError: 
    org/apache/commons/codec/binary/Hex 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:466) 
    at my.custom.class.Loader.loadClass(...) 

望着的Javadoc,我不希望defineClass拋出此特定錯誤。 org/apache/commons/codec/binary/Hex是我正在嘗試加載的課程。這幾乎就好像defineClass在定義類之前需要一個類的副本 - 這對我來說沒有意義。

想法?

+1

你能展示你的代碼嗎?您是否按照建議覆蓋了findClass()?否則,你必須非常小心才能把事情做好。 – Voo 2011-05-30 18:41:33

+0

*這幾乎就像define class在類定義class之前需要一個類的副本,不是它不需要該類的副本。你是如何設法定義一個包名'class'的? – bestsss 2011-05-30 19:12:19

+0

@bestsss大概是堆棧跟蹤只是模糊的包名稱選擇 – 2011-05-31 06:03:28

回答

11

A ClassCircularityError當某個類是自身的(間接)超類時引發A ClassCircularityError,某些接口(間接地)擴展自己或類似。

這通常不會發生,因爲行爲良好的編譯器不會生成此類,但使用不同版本的庫(或使用包含不同版本類的多個庫)可能會帶來此問題。

掃描您的庫的雙類名稱,特別是看看是否有多個版本的上述org.apache.commons.codec.binary.Hex類。