Tengo un proyecto con una carpeta "entrada" que contiene algunos archivos java (p. ej., test.java). Esta carpeta no es una fuente raíz y así es. Solo quiero analizar los archivos en la carpeta de entrada con mi programa. Un objetivo es obtener el código de bytes de los archivos en la carpeta de entrada y guardarlo en una cadena. Leí mucho sobre cómo obtener bytecodes de las clases (agentes de Java, bcel) pero no tengo muy claro cómo debo comenzar. ¿Tienes alguna idea y consejo para mí?
Editar: Compilé mis archivos y los guardé en una matriz de bytes. Usé la biblioteca javaassist como lo mencionó alguien. Mi código es ahora:
ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.get("Test"); byte[] b = cc.toBytecode(); System.out.println(Arrays.toString(b));Como resultado estoy obteniendo:
[-54, -2, -70, -66, 0, 0, 0, 52, 0, 93, 10, 0, 25, 0, 52, 8, 0, 53, 7, 0,...,115]¿Cómo puedo obtener de la matriz de bytes la forma de código de bytes "legible por humanos", por ejemplo:
iconst_0 // 03 istore_0 // 3b iinc 0, 1 // 84 00 01 iload_0 // 1a iconst_2 // 05 imul // 68 istore_0 // 3b goto -7 // a7 ff f9¿Alguien tiene alguna idea?
"bytecode" se refiere a archivos de clase compilados. No tiene sentido preguntar cómo obtener el código de bytes de un archivo .java porque no hay código de bytes para obtener. Debe compilarlos con javac , Eclipse o similar. Luego, puede leer los archivos .class resultantes de la forma que desee.
Editar: para convertir el archivo de clase en una forma legible por humanos, necesita un desensamblador. Un desensamblador limitado llamado javap está incluido en el JDK, por lo que el enfoque más simple sería simplemente usarlo. Alternativamente, puede usar el desensamblador Krakatau , que admite funciones mucho más avanzadas que javap.