ClassLoader.defineClass抛出的ClassCircularityError

时间:2011-05-30 18:20:06

标签: java circular-dependency classloader

我正在使用自定义类加载器加载类。在大多数情况下,一切都有效,但有时当我加载特别复杂的项目/库时,我会遇到一个奇怪的错误:

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(...)

看看Javadocs,我不希望defineClass抛出这个特殊的错误。 org/apache/commons/codec/binary/Hex是我正在尝试加载的类。几乎就好像defineClass在定义类之前想要一个类的副本 - 这对我来说毫无意义。

想法?

2 个答案:

答案 0 :(得分:13)

当某个类本身是(间接)超类时,抛出ClassCircularityError,某些接口(间接)扩展自身或类似。

这通常不应该发生,因为表现良好的编译器不会生成这样的类,但是使用不同版本的库(或使用包含不同版本的类的几个库)可能会带来这个问题。

扫描您的库以获取双类名称,特别是看看上面提到的org.apache.commons.codec.binary.Hex类的多个版本。

答案 1 :(得分:0)

在定义类的过程中发生异常时也会抛出 ClassCircularityError,例如在使用自定义类加载器时。

异常类型具有误导性,但我认为您可以检查包含的异常,它应该反映实际发生的情况。

(完全公开:我编写自己的类加载器。)

这是一个例子:

java.lang.StackOverflowError
    at java.base/java.lang.LinkageError.<init>(LinkageError.java:55)
    at java.base/java.lang.ClassCircularityError.<init>(ClassCircularityError.java:53)

在这里,我的类加载器中抛出的 StackOverflowError 是问题的真正原因。不涉及阶级循环。最初我也被这条消息弄糊涂了。