java - overload - qué función cumple la herramienta bytecode?
Entendiendo el código de bytes de Java (6)
Tengo dos preguntas
1) ¿Qué herramientas están disponibles para ver el código de bytes de Java (preferiblemente disponible desde la línea de comandos de Linux)?
La herramienta javap
(con la opción -c) desensamblará un archivo de bytecode. Se ejecuta desde la línea de comandos y se suministra como parte del SDK de Java.
2) ¿Cuáles son las buenas referencias para familiarizarse con la sintaxis del código de bytes Java?
La herramienta javap
usa la misma sintaxis que se usa en la especificación JVM, y la especificación JVM es, naturalmente, la fuente definitiva. También vi "Inside the Java Virtual Machine" por Bill Venners. Nunca lo he leído, y parece que está agotado.
La sintaxis real (textual) es simple y se explica por sí misma ... asumiendo que tiene una referencia que explica qué hacen los códigos de bytes y que está moderadamente familiarizado con la lectura de códigos en este nivel. Pero es probable que sea más fácil leer la salida de un descompilador, incluso si los códigos de bytes se han introducido a través de un ofuscador.
A menudo me quedo con un archivo de clase java sin fuente y estoy tratando de entender el problema que tengo a mano.
Tenga en cuenta que un descompilador es útil pero no suficiente en todas las situaciones ...
Tengo dos preguntas
- Qué herramientas están disponibles para ver el código de bytes de Java (preferiblemente disponible desde la línea de comandos de Linux)
- ¿Cuáles son las buenas referencias para familiarizarse con la sintaxis del código de bytes Java?
Para ver la instrucción de javap -v
de los archivos de clase, use el comando javap -v
, de la misma manera que si ejecuta un programa java, especificando classpath (si es necesario) y el nombre de la clase.
Ejemplo:
javap -v com.company.package.MainClass
Acerca del conjunto de instrucciones de bytecode, resumen de conjunto de instrucciones
Puede que encuentre útil el complemento de Esquema de código de byte de Eclipse:
http://andrei.gmxhome.de/bytecode/index.html
No lo he usado yo mismo, solo lo he visto mencionado de pasada.
Si tiene una clase y no tiene código fuente, pero tiene un error, puede hacer una de dos cosas básicas:
- Descompilar, corregir el error y volver a crear el archivo jar. He hecho esto antes, pero los administradores de sistemas son recelosos acerca de poner eso en producción.
Escriba las pruebas unitarias para la clase, determine las causas del error, informe el error con las pruebas unitarias y espere a que se solucione.
(2) es generalmente el que prefieren los administradores de sistemas, en mi experiencia.
Si va con (2) entonces, mientras tanto, ya que sabe qué causa el error, no puede permitir que esa entrada vaya a la clase, para evitar un problema, o estar preparado para manejarlo adecuadamente cuando ocurra el error .
También puede usar AspectJ para inyectar código en la clase problemática y cambiar el comportamiento del método sin volver a compilarlo. Creo que esta puede ser la opción preferible, ya que puede cambiarlo para todos los códigos que puedan llamar a la función, sin preocuparse por enseñar a todos sobre el problema.
Si aprende a leer las instrucciones del código de bytes, ¿qué hará para resolver el problema?
Fernflower es un descompilador analítico, por lo que descompilará las clases en un código java legible en lugar de códigos de bytes. Es mucho más útil cuando quieres entender cómo funciona el código.
En lugar de mirar directamente el código de bytes de Java, que requerirá familiaridad con la máquina virtual de Java y sus operaciones, se podría intentar usar una utilidad de descompilación de Java. Un descompilador intentará crear un archivo de origen java
desde el archivo de class
especificado.
¿Cómo "descompilo" los archivos de clase de Java? es una pregunta relacionada que sería informativa para descubrir cómo descompilar archivos de class
Java.
Dicho esto, se podría usar el comando javap
que forma parte del JDK para desensamblar class
archivos de class
Java. La salida de javap
será el bytecode de Java contenido en los archivos de class
. Pero tenga en cuenta que el código de bytes no se parece en nada al código fuente de Java.
La fuente definitiva para aprender sobre el código de bytes de Java y la propia Máquina Virtual de Java sería la Especificación de la Máquina Virtual de Java, Segunda Edición . En particular, el Capítulo 6: El conjunto de instrucciones de la máquina virtual Java tiene un índice de todas las instrucciones del código de bytes.