🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* 编译时使用`javac`指令,将源码编译生成字节码,并存入到对应的`.class`文件中。 ```java package javabasic; public class ByteCodeSample { public static void main(String[] args) { int i = 1, j = 5; i++; ++j; System.out.println(i); System.out.println(j); } } ``` 使用`javac ByteCodeSample.java` 编译生成`ByteCodeSample.class`文件,使用`javap -c ByteCodeSample.class`对字节码进行反汇编,查看字节码内容。 ```java Compiled from "ByteCodeSample.java" public class javabasic.ByteCodeSample { public javabasic.ByteCodeSample(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_1 //将常量1放到栈顶 1: istore_1 //将栈顶的值放到局部变量1中 2: iconst_5 //将常量2放到栈顶 3: istore_2 //将栈顶的值放到局部变量2中 4: iinc 1, 1 //将变量1加1 7: iinc 2, 1 //将变量2加1 10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 13: iload_1 14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 17: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 20: iload_2 21: invokevirtual #3 // Method java/io/PrintStream.println:(I)V 24: return } ``` ![](https://github.com/xmisaka/JavaOffer/raw/master/Documents/imgs/java%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3%E6%80%A7.png) * 运行时`.class`文件是跨平台的基础,`Java`源码首先被编译成字节码,再由不同平台的`JVM`进行解析, `Java`语言在不同的平台运行时不需要重新进行编译,`Java`虚拟机在执行字节码的时候,把字节码解释成具体平台上的机器指令。 > Q:为什么`JVM`不直接将源码解析成机器码去执行 > A:每次执行的时候都需要进行各种语法、句法、语义的检查,即每次执行的时候这些分析的结果都不会保存下来, > 要重新进行编译,重新去分析,这样整体的性能就会受到影响。同时,也可以脱离`Java`的束缚,将别的语言解析成字节码,同样能被`JVM`执行。