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