ClassCircularityError, брошенный ClassLoader.defineClass

Я загружаю классы, используя пользовательский загрузчик классов. По большей части все работает, но иногда, когда я загружаю особенно сложные проекты / библиотеки, я получаю странную ошибку:

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 ответа

ClassCircularityError генерируется, когда некоторый класс является (косвенным) суперклассом самого себя, некоторый интерфейс (косвенно) расширяет себя или подобное.

Обычно это не должно происходить, так как компилятор с хорошим поведением не будет создавать такие классы, но использование разных версий библиотеки (или использование нескольких библиотек, содержащих разные версии класса) может привести к этой проблеме.

Сканирование ваших библиотек на наличие двойных имен классов, в частности, посмотрите, есть ли несколько версий упомянутых org.apache.commons.codec.binary.Hex учебный класс.

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, брошенный внутри моего загрузчика классов, является реальной причиной проблем. Никаких классовых круговоротов не было. Изначально меня тоже смутило сообщение.

Другие вопросы по тегам