乐趣区

关于jvm:JVM-进阶-Java字节码

点击 blog 即可查看原文和更多的文章,欢送 star。

什么是 Java 字节码

Java 字节码是由 (.Java) 文件编译成 (.class) 的文件。之所以叫字节码是因为 (.class) 文件是由十六进制组成的。而 JVM 以两个十六进制值为一组,即以字节为单位进行读取。java 之所以可能做到一次编译、到处运行,就是因为不同的平台都会编译成雷同的 (.class) 文件,所以能力在不同的平台执行。这种跨平台执行的实现,极大的进步了开发和保护的老本。

怎么查看字节码

查看字节码有很多种办法,网上也有一些插件能够查看。咱们这里直说一种就是通过 javap 命令来查看。

先通过 javap -help 来查看下这个命令怎么应用:

用法: javap <options> <classes>
其中, 可能的选项包含:
  -? -h --help -help               输入此帮忙音讯
  -version                         版本信息
  -v  -verbose                     输入附加信息
  -l                               输入行号和本地变量表
  -public                          仅显示公共类和成员
  -protected                       显示受爱护的 / 公共类和成员
  -package                         显示程序包 / 受爱护的 / 公共类
                                   和成员 (默认)
  -p  -private                     显示所有类和成员
  -c                               对代码进行反汇编
  -s                               输入外部类型签名
  -sysinfo                         显示正在解决的类的
                                   零碎信息 (门路, 大小, 日期, MD5 散列)
  -constants                       显示最终常量
  --module < 模块 >, -m < 模块 >       指定蕴含要反汇编的类的模块
  --module-path < 门路 >             指定查找利用程序模块的地位
  --system <jdk>                   指定查找零碎模块的地位
  --class-path < 门路 >              指定查找用户类文件的地位
  -classpath < 门路 >                指定查找用户类文件的地位
  -cp < 门路 >                       指定查找用户类文件的地位
  -bootclasspath < 门路 >            笼罩疏导类文件的地位

接下来咱们定义一个简略的类

/**
 * @author: lixiaoshuang
 * @create: 2020-11-30 19:57
 **/
public class HelloByteCode {public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int c = a + b;
        System.out.println(c);
    }
}

而后执行 javac HelloByteCode.java,这样就的到了 HelloByteCode.class 文件,它就是咱们所说的字节码文件。编译实现后咱们先用文本工具关上 (.class) 文件看下:

魔数

关上后是一堆十六进制数,能够看到上图中用蓝色框标记起来的 cafe babe 就是魔数,所有的字节码文件都是以这个为结尾的,魔数的固定值为:0xCAFEBABE,魔数放在文件的结尾是为了让 jvm 辨认这个文件是不是一个.class 文件,如果不是就不会进行下一步的操作。

版本号

同样还是上边的字节码图,黄色框圈起来的是版本号,0000 0037,0000 为次版本号,0037 位主版本,次版本号转化为十进制为 0,主版本号转化为十进制为 55,通过 Oracle 官网查问可知,55 对应的版本号是 jdk 11。

查看反编译

接下来应用 javap -v -l -c HelloByteCode 命令对 (.class) 文件进行反编译。具体每一块是干什么我在图中具体的标出来了,大家能够认真看上面的图片。就不一一介绍了,次要包含版本号、拜访标记、接口信息、常量池、办法形容、操作指令、行号表、本地变量表(图中没有体现进去,大家能够用命令将本地变量表输入进去本人看下)

退出移动版