2011-09-13 15 views
5

Tenemos un caché (Map) con objetos de la clase TestClass. Otra cargador de clase inicializa/cargas TestClass en tiempo de ejecución de nuevo, por lo que a continuación se tiró un código ClassCastException:La clase A no es igual a la clase A

TestClass obj1 = (TestClass)map.get("key"); // throws a ClassCastException 

ClassCastException when casting to the same class

De acuerdo, entiendo este problema hasta este punto.

Por lo tanto, estaba tratando de encontrar información de antecedentes por qué TestClass.class no es igual a TestClass.class. Supongo que el cargador de clases diferente establece un ID diferente para el ReferenceType? ¿Alguien capaz de explicarme el trasfondo?

mejor que he encontrado: http://www.objectsource.com/j2eechapters/Ch21-ClassLoaders_and_J2EE.htm

Respuesta

8

Sí, sus investigaciones apuntan a la dirección correcta: la misma definición de la clase cargada por los cargadores de clases diferentes se ve como dos clases distintas de la JVM. Por lo tanto, la conversión entre ellos falla con ClassCastException.

Creo que la diferencia es simplemente porque hay dos objetos token de clase distintos en juego. Tiene que ser así, ya que las clases cargadas por los diferentes cargadores pueden ser, de hecho, versiones diferentes de la misma clase. Se sabe que el token de clase para cada clase es único (dentro del mismo reino de cargador de clases, eso es). Abriría una lata de gusanos si la JVM comenzara a comparar tokens de clase por sus diversos atributos, en lugar de por igualdad física (==).

1

Lo que experimentas es la razón por la que existen cargadores de clases personalizados. Permiten cargar diferentes clases con el mismo nombre en una JVM. La identidad de una clase en una JVM está dada por la tupla que consiste en el nombre de clase y el cargador de clases. En el lenguaje Java, una clase se identifica solo con un nombre completamente calificado.

1

¿Alguien me puede explicar el trasfondo?

Como ya explicó Péter Török, se consideran diferentes cuando se cargan desde diferentes cargadores de clases. El trasfondo es que un servidor de aplicaciones debe ser capaz de soportar diferentes versiones de una aplicación, p. diferentes versiones de las mismas bibliotecas incluidas en sus archivos ear-files.

1

No hay ningún misterio. igualdad de tiempo de ejecución de tipos se define en la especificación del lenguaje Java como sigue:.

"En tiempo de ejecución, varios tipos de referencia con el mismo nombre del archivo binario se pueden cargar simultáneamente por diferentes cargadores de clases Estos tipos pueden o no pueden representar la misma declaración de tipo. Incluso si dos de esos tipos representan la misma declaración de tipo, se consideran distintos ".

JLS 4.3.4 - When reference types are the same. (2 ° párrafo)

Cuestiones relacionadas