2011-05-30 6 views
10

Estoy cargando clases utilizando un cargador de clases personalizado. En su mayor parte, todo funciona, pero a veces cuando me carga particularmente complejos proyectos/librerías, aparece un bicho raro:ClassCircularityError lanzado por 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(...) 

Mirando el Javadocs, yo no esperaría defineClass para lanzar este error en particular. org/apache/commons/codec/binary/Hex es la clase que estoy tratando de cargar. Es casi como si defineClass quisiera una copia de la clase antes de que defina la clase, lo cual no tiene sentido para mí.

Ideas?

+1

¿Podría mostrar su código? ¿Acaba de sobrescribir findClass() como se recomienda? De lo contrario, debes ser muy cuidadoso para que todo salga bien. – Voo

+0

* Es casi como definir que la clase quiere una copia de la clase antes de definir la clase *, no, no quiere una copia de la clase. ¿Y cómo se las arregló para definir un nombre de paquete 'clase'? – bestsss

+0

@bestsss, presumiblemente, el seguimiento de la pila está ofuscado con una mala elección de los nombres de paquete –

Respuesta

11

A ClassCircularityError se arroja cuando alguna clase es una superclase (indirecta) de sí misma, alguna interfaz (indirectamente) se extiende a sí misma o similar.

Esto normalmente no debería ocurrir ya que un compilador de buen comportamiento no producirá dichas clases, pero usar diferentes versiones de una biblioteca (o usar varias bibliotecas que contengan diferentes versiones de una clase) podría traer este problema.

Escanee sus bibliotecas para nombres de clases dobles, en particular eche un vistazo si hay varias versiones de la mencionada clase org.apache.commons.codec.binary.Hex.

Cuestiones relacionadas