estaba leyendo el código de bytes de Java y vi esto:Lectura de una instrucción de bytecode de Java: ¿Qué significa el número?
getfield #5 (Field java.lang.String name)
¿Qué significa #5
?
¿Y cómo puedo escribir un programa en bytecode?
estaba leyendo el código de bytes de Java y vi esto:Lectura de una instrucción de bytecode de Java: ¿Qué significa el número?
getfield #5 (Field java.lang.String name)
¿Qué significa #5
?
¿Y cómo puedo escribir un programa en bytecode?
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
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):
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!
Al escribir un programa en Java y compilarlo. – Jeffrey
¿Qué estás buscando lograr? ¿Optimizaciones ASM-like para JVM? – Thomas