ClassCircularity Class 由 ClassLoader.defineClass 引发的错误

2022-09-04 02:31:03

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

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,我不会期望抛出这个特定的错误。 是我正在尝试加载的类。这几乎就像在定义类之前想要一个类的副本 - 这对我来说毫无意义。defineClassorg/apache/commons/codec/binary/HexdefineClass

想法?


答案 1

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

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

扫描库中的双类名称,特别是查看所提到的类是否有多个版本。org.apache.commons.codec.binary.Hex


答案 2

如果在定义类期间(例如,使用自定义类装入器时)发生异常,也会引发类循环错误。

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

(完全披露:我编写自己的类加载器。

下面是一个示例:

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

在这里,在我的类加载器中抛出的StackOverflowError是问题的实际原因。没有涉及阶级循环。最初,我也对这个信息感到困惑。


推荐