Java字节码只是简单的了解,感觉缺乏深入的了解,特写此篇记录下。
准备一个HelloWorld的测试类。
1 2 3 4 5
| public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
|
编译生成HelloWorld.class文件
我们使用javap命令来查看class文件
1
| javap -v HelloWorld.class
|
输出结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| Classfile /Users/jasperji/eclipse-workspace/maventest/src/main/java/com/jasper/ji/maven/test/HelloWorld.class Last modified 2021-9-8; size 452 bytes MD5 checksum 1f346aeb85559b06180507b8838406dd Compiled from "HelloWorld.java" public class com.jasper.ji.maven.test.HelloWorld minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: { public com.jasper.ji.maven.test.HelloWorld(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial 4: return LineNumberTable: line 3: 0
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: getstatic 3: ldc 5: invokevirtual 8: return LineNumberTable: line 5: 0 line 6: 8 } SourceFile: "HelloWorld.java"
|
另外也可以直接查看二进制,这里使用hexdump。
1
| hexdump HelloWorld.class
|
不过感觉还是javap提供的这个比较人性化,更好的阅读。
总结
字节码作为一种中间形式,Java可以编译成字节码,Scala也可以编译成字节码,但是从语言层面他们又是不一样的。这个也让我重新再读了下《Java程序员修炼之道》这本书,原来对于书中第三部分JVM上的多语言编程,不是很感冒。但字节码并不是机器码,所以在理解某些问题时最终还是要落到汇编语言级别的。
参考
字节码增强技术探索