2012-02-17 5 views

Respuesta

6

Java archivos de clase y código de bytes

archivos de clase Java (bytecode-files) se compone de diferentes componentes:

http://en.wikipedia.org/wiki/Java_class_file

  • número mágico: 0xCAFEBABE
  • Versión del archivo de clase Formato: las versiones menores y principales del archivo de clase
  • Pool constante: conjunto de constantes para la clase
  • (...)
  • campos: Cualquier campos de la clase
  • Métodos: Los métodos de la clase
  • Atributos: Cualquier atributos de la clase (por ejemplo, el nombre de la SourceFile, etc.)

El número 5 simplemente se refiere a una ubicación en el conjunto constante. Y en esa posición se encuentra CONSTANT_FieldRef que contiene una referencia a un CONSTANT_NameAndType entre otros atributos. Y CONSTANT_NameAndType contiene una referencia a un CONSTANT_Utf8

De modo que el flujo se parece a esto (que contiene la cadena/nombre real.):

getfield #number -> FieldRef -> NameAndType -> Utf8 -> string 

http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

Así que en lugar de guardar una frase entera en cada getfield instrucción, se guarda un número. Esto mejora el rendimiento en el intérprete (o JIT) y el espacio en el archivo de clase.

bytecodes escribir a mano

códigos de bytes escritos a mano se puede montar en un archivo de clase con esta herramienta (que contiene una gran cantidad de ejemplos):

http://jasmin.sourceforge.net/

4

La instrucción getfield (IIRC) hace una referencia en el conjunto constante del archivo de clase para obtener información sobre qué campo se debe buscar. El # 5 aquí significa "número de entrada de grupo constante 5" y este grupo de constantes contiene información que dice "busque el campo name del tipo java.lang.String". La razón de esto es que mantiene el tamaño de la instrucción getfield igual, independientemente del nombre o tipo del campo para buscar.

No estoy seguro de entender lo que quiere decir con "¿cómo puedo escribir el programa en bytecode?" Esta es una pregunta bastante abierta; es similar a preguntar cómo escribir programas en cualquier idioma, y ​​requiere una gran cantidad de aprendizaje. Es posible que desee ver en la Jasmin ensamblador de Java, que puede simplificar en gran medida este proceso.

Espero que esto ayude!

Cuestiones relacionadas