2011-03-21 22 views
5

estaba leyendo this artículo, y se dice que:instancia de clase obtenida a través de cargador de clases múltiples

Si tenemos dos instancias de la clase Estudiante cargado por estos CustomClassLoaders dicen STUDENT1 y student2, entonces STUDENT1 y student2 no son tipo compatible. En otras palabras,

Estudiante student3 = (Estudiante) student2;

arrojará ClassCastException, porque la JVM ve estos dos como tipos de clases separadas y distintas, ya que están definidas por diferentes instancias de ClassLoader.

Ahora entiendo lo que quiere transmitir: es decir, si cargamos la misma clase utilizando dos cargadores de clases diferentes, entonces no serán compatibles con el tipo. Hasta aquí todo bien.

Pero el ejemplo que se ha utilizado es lo que me confunde, es decir

student3 = (Estudiante) student2 Estudiante;

No será que cuando declaramos una variable como refrance Estudiante estudiante, lo compilador todas busca es que este studnet está presente en su ubicación correcta en cumplimiento de su paquete de structure.Now cuando en tiempo de ejecución asignamos esta variable de referencia a una clase cargada real, ¿realmente importa qué cargador de clases usemos para cargar dicha clase? Dudo, porque desde mi entendimiento, un cargador de clases entra en juego solo cuando hacemos un ' nuevo 'o lo llamamos campo estático y no cuando simplemente declaramos un tipo de él.

Por favor aclararme sobre esto y ayudarme a rectificar mi entendimiento al respecto.

Gracias, Mawia

Respuesta

3

Eso es sobre todo correcto, pero cuando la asignación ocurre, la JVM tiene que asegurarse de que es correcta. Entonces verifica: ¿Puedo asignar el lado derecho (RHS) al lado izquierdo (LHS)?

Las reglas dicen que esto está permitido cuando puede bajar el tipo de tiempo de ejecución del RHS al tipo del LHS.

Por lo tanto, en tiempo de compilación, el código anterior se ve bien. Pero en tiempo de ejecución, la llamada isAssignableFrom() devuelve falso porque los dos tipos son diferentes.

El método equals() en Class rendimientos true si los nombres calificados son iguales y cuando el cargador de clases es el mismo. Es por eso que obtienes un ClassCastException en este caso.

Los métodos utilizados se implementan como código nativo, por lo que no puede ver lo que está sucediendo. Pero los métodos isInstance() y isAssignableFrom() solo devuelven verdadero cuando el cargador de clases para ambas clases es el mismo.

+0

Pero lo que hizo que jvm piense que los dos son diferentes. Hasta ahora, no hay ningún cargador de clases asociado con student3. Sólo student2 se asigna a un objeto cargado por algún cargador de clases. – mawia

+0

@mawia: Sí, lo hay: para realizar el control, la JVM tiene que cargar la clase para 'student3'. Entonces, podrías decir que la carga de clases también ocurre para las asignaciones de variables. o cuando llamas a 'Class.forName()' –

1

Sí, en tiempo de ejecución realmente importa qué cargador de clases cargó una clase. Y el cargador de clases se inspecciona cada vez que se tiene que cargar una clase. Eso no es solo cuando se encuentra un new o un campo estático.Eso ocurre cada vez que aparece el nombre de la clase en el código de Java, o para ser más precisos, cuando se hace referencia al nombre de una clase en el código de bytes y se ejecuta el código de bytes.

Cuestiones relacionadas