2012-03-13 8 views
9

Digamos que hay algunas sentencias de importación en una clase. Cuando se genera el código de bytes para esa clase, ¿qué ocurre con estas sentencias de importación?significado de código de importación de bytes significado

Si las instrucciones de importación se ignoran durante el tiempo de ejecución, ¿cómo se resuelven las dependencias de los métodos de clase durante el tiempo de ejecución?

+4

¿Por qué no lo descubres? Escriba algunas variantes de una clase: una con dependencia de clases externas, una que dependa (por ejemplo) de 'java.util.List' a través de la importación, y otra que dependa de' List' pero la use completamente calificada (sin una importación)) Luego use 'javap -c' en cada uno y vea lo que sale. – yshavit

+1

Complementario al comentario de @yshavit, durante la compilación use 'javac -g: none Foo.java' para no generar información de depuración (por ejemplo, números de línea) en absoluto en los archivos' .class', luego compare las '.class'es generadas y serán idénticos en el nivel de bytes y esto se puede probar obteniendo el hash para cada uno de ellos. –

Respuesta

9

El propósito de las declaraciones de importación es simplemente hacer la vida más fácil para los lectores (y autores) humanos del código. Por lo tanto, se reemplazan por referencias a los nombres de clase/método completamente calificados en bytecode. Y las declaraciones de importación no utilizadas se ignoran.

1

importación en Java es un atajo por

de manera que si importa java.util.* usted no tiene que escribir java.util.ArrayList en su código, pero puede escribir ArrayList

1

import declaraciones están allí sólo por el compilador por lo que sabe a qué nombres de clase (o nombres de métodos estáticos) puede acceder sin calificar en su código (es decir, MyClass en lugar de foo.bar.MyClass). Detrás de escena esto solo se usa para resolver los nombres de clase completamente calificados que luego se usan también en el bytecode.

+1

Se usa para resolver nombres no calificados * a * nombres completos. – EJP

+0

Eso es lo que quise decir. No debería escribir en idiomas extranjeros mientras aún estoy medio dormido;) – Joey