返回
字节码构造-主副版本号详细解析!
后端
2023-04-06 23:59:39
字节码:Java 代码通向跨平台的桥梁
什么是字节码?
字节码是一种介于 Java 源码和机器码之间的中间语言。当 Java 编译器将源代码编译为类文件时,字节码就会被生成。字节码包含有关 Java 程序结构和指令的详细,但它与任何特定的机器指令集无关。
字节码的跨平台优势
字节码的跨平台特性是 Java 的核心优势之一。由于字节码不是针对任何特定平台编写的,因此它可以在任何安装了 Java 虚拟机 (JVM) 的操作系统和硬件平台上执行。JVM 负责将字节码翻译成本机机器指令,从而使 Java 程序可以在不同的平台上运行。
主版本号:标识重大更新
字节码中包含一个主版本号,用整数表示,用于标识重大更新。例如,Java 8 的主版本号为 52。主版本号的更改通常意味着不兼容的代码更改,导致旧版 JVM 无法执行新版字节码。
副版本号:指示增量更新
副版本号也用整数表示,紧随主版本号之后。副版本号指示增量更新,通常不会破坏向后兼容性。这意味着旧版 JVM 通常可以执行新版字节码,即使主版本号不同。
如何巧妙使用主副版本号
主版本号和副版本号的巧妙使用对于实现代码兼容性至关重要。主版本号升级适用于不兼容的重大更新,而副版本号升级适用于兼容的增量更新。
实例演示:Java 8 和 Java 11 代码兼容性
以下 Java 8 代码:
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello, Java 8!");
}
}
编译后将生成以下字节码:
ca fe ba be 00 00 00 34 00 15 07 00 08 07 00 09 01 00 06 43 6f 64 65 01 00 03 28 29 56 01 00 04 4c 69 6e 65 4e 75 6d 62 65 72 01 00 03 6d 61 69 01 00 04 4a 61 76 61 0c 00 05 73 6f 75 72 63 65 46 69 6c 65 01 00 04 48 65 6c 6c 6f 01 00 0a 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 01 00 03 6d 61 69 6e 01 00 04 50 72 69 6e 74 53 74 72 65 61 6d 01 00 10 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 3b 01 00 05 70 72 69 6e 74 6c 6e 01 00 03 6f 75 74 01 00 04 53 79 73 74 65 6d 2e 6f 75 74 01 00 0f 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d 3b 01 00 0a 48 65 6c 6c 6f 2c 20 4a 61 76 61 21 01 00 0f 0a 00 0b 07 00 0c 01 00 0d 49 4e 56 4f 4b 45 5f 49 4e 56 4f 4b 45 01 00 0e 4c 6a 61 76 61 2f 75 74 69 6c 2f 4c 69 73 74 3b 01 00 0f 4a 61 76 61 2e 6c 61 6e 67 2e 4f 62 6a 65 63 74 01 00 12 6a 61 76 61 2f 6c 61 6e 67 2f 52 75 6e 74 69 6d 65 3b 01 00 13 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 01 00 14 4c 6a 61 76 61 2f 6c 61 6e 67 2f 54 68 72 6f 77 61 62 6c 65 3b 01 00 15 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 53 69 7a 65 3b 01 00 16 4c 6a 61 76 61 2f 6c 61 6e 67 2f 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 3b 01 00 17 4c 6a 61 76 61 2f 75 74 69 6c 2f 48 61 73 68 6d 61 70 3b 01 00 18 4c 6a 61 76 61 2f 6c 61 6e 67 2f 43 6c 61 73 73 3b 01 00 19 4c 6a 61 76 61 2f 6c 61 6e 67 2f 52 65 66 6c 65 63 74 69 6f 6e 3b 01 00 1a 4c 6a 61 76 61 2f 6c 61 6e 67 2f 49 6e 74 65 67 65 72 3b 01 00 1b 4c 6a 61 76 61 2f 75 74 69 6c 2f 56 65 63 74 6f 72 3b 01 00 1c 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 42 75 69 6c 64 65 72 3b 01 00 1d 4c 6a】
在 Java 11 中,字节码的主版本号已更改为 55。然而,由于 Java 11 中未