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