Просмотр байт-кода файла класса Java

Часто нам нужно понять, что компилятор делает под капотом. Как операторы Java, которые мы пишем, будут переупорядочены и выполнены. Также нам нужно увидеть байт-код в учебных целях, я делаю это редко. В этом уроке я привожу пример того, как сгенерировать байт-код для файла класса в Java.

Для демонстрации примера я использую файл Java, созданный для моего другого руководства, посвященного автоматическому управлению ресурсами в Java 7.

1. Скомпилируйте файл Java с помощью команды javac

Это необязательно, поскольку у вас уже может быть файл .class.

prompt > javac C://temp/java/test/ResourceManagementInJava7.java

Это приведет к созданию файла .class ResourceManagementInJava7.class.

2. Выполнить команду javap и перенаправить вывод в файл .bc

C:>javap -c C://temp/java/test/ResourceManagementInJava7.class > C://temp/java/test/bytecode.bc
Вид папки
Вид папки

Давайте рассмотрим команду, запущенную в командной строке.

java_byte_code_javap_command_window
Вид окна команд

Файл bytecode.bc будет сгенерирован в указанном месте. Он будет выглядеть примерно так:

public class com.howtodoinjava.java7.tryCatch.ResourceManagementInJava7 {public com.howtodoinjava.java7.tryCatch.ResourceManagementInJava7();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: new #2 // class java/io/BufferedReader3: dup4: new #3 // class java/io/FileReader7: dup8: ldc #4 // String C:/temp/test1.txt10: invokespecial #5 // Method java/io/FileReader."<init>":(Ljava/lang/String;)V13: invokespecial #6 // Method java/io/BufferedReader."<init>":(Ljava/io/Reader;)V16: astore_117: aconst_null18: astore_219: new #2 // class java/io/BufferedReader22: dup23: new #3 // class java/io/FileReader26: dup27: ldc #7 // String C:/temp/test2.txt29: invokespecial #5 // Method java/io/FileReader."<init>":(Ljava/lang/String;)V32: invokespecial #6 // Method java/io/BufferedReader."<init>":(Ljava/io/Reader;)V35: astore_336: aconst_null37: astore 439: new #2 // class java/io/BufferedReader42: dup43: new #3 // class java/io/FileReader46: dup47: ldc #8 // String C:/temp/test3.txt49: invokespecial #5 // Method java/io/FileReader."<init>":(Ljava/lang/String;)V52: invokespecial #6 // Method java/io/BufferedReader."<init>":(Ljava/io/Reader;)V55: astore 557: aconst_null58: astore 660: aload 562: ifnull 13865: aload 667: ifnull 9070: aload 572: invokevirtual #9 // Method java/io/BufferedReader.close:()V75: goto 13878: astore 780: aload 682: aload 784: invokevirtual #11 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V87: goto 13890: aload 592: invokevirtual #9 // Method java/io/BufferedReader.close:()V95: goto 13898: astore 8100: aload 5102: ifnull 135105: aload 6107: ifnull 130110: aload 5112: invokevirtual #9 // Method java/io/BufferedReader.close:()V115: goto 135118: astore 9120: aload 6122: aload 9124: invokevirtual #11 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V127: goto 135130: aload 5132: invokevirtual #9 // Method java/io/BufferedReader.close:()V135: aload 8137: athrow138: aload_3139: ifnull 219142: aload 4144: ifnull 166147: aload_3148: invokevirtual #9 // Method java/io/BufferedReader.close:()V151: goto 219154: astore 5156: aload 4158: aload 5160: invokevirtual #11 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V163: goto 219166: aload_3167: invokevirtual #9 // Method java/io/BufferedReader.close:()V170: goto 219173: astore 5175: aload 5177: astore 4179: aload 5181: athrow182: astore 10184: aload_3185: ifnull 216188: aload 4190: ifnull 212193: aload_3194: invokevirtual #9 // Method java/io/BufferedReader.close:()V197: goto 216200: astore 11202: aload 4204: aload 11206: invokevirtual #11 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V209: goto 216212: aload_3213: invokevirtual #9 // Method java/io/BufferedReader.close:()V216: aload 10218: athrow219: aload_1220: ifnull 290223: aload_2224: ifnull 243227: aload_1228: invokevirtual #9 // Method java/io/BufferedReader.close:()V231: goto 290234: astore_3235: aload_2236: aload_3237: invokevirtual #11 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V240: goto 290243: aload_1244: invokevirtual #9 // Method java/io/BufferedReader.close:()V247: goto 290250: astore_3251: aload_3252: astore_2253: aload_3254: athrow255: astore 12257: aload_1258: ifnull 287261: aload_2262: ifnull 283265: aload_1266: invokevirtual #9 // Method java/io/BufferedReader.close:()V269: goto 287272: astore 13274: aload_2275: aload 13277: invokevirtual #11 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V280: goto 287283: aload_1284: invokevirtual #9 // Method java/io/BufferedReader.close:()V287: aload 12289: athrow290: goto 298293: astore_1294: aload_1295: invokevirtual #13 // Method java/io/IOException.printStackTrace:()V298: returnException table:from to target type70 75 78 Class java/lang/Throwable110 115 118 Class java/lang/Throwable98 100 98 any147 151 154 Class java/lang/Throwable39 138 173 Class java/lang/Throwable39 138 182 any193 197 200 Class java/lang/Throwable173 184 182 any227 231 234 Class java/lang/Throwable19 219 250 Class java/lang/Throwable19 219 255 any265 269 272 Class java/lang/Throwable250 257 255 any0 290 293 Class java/io/IOException}
Прокрутить вверх