一、Java虚拟机的组成
二、字节码文件的组成
1、基本信息
魔数、字节码文件对应的Java版本号访问标识(public final等等)父类和接口。
2、常量池
保存了字符串常量、类或接口名、字段名主要在字节码指令中使用。
- 常量池中的数据都有一个编号,编号从1开始。在字段或者字节码指令中通过编号可以快速的找到对应的数据。
- 字节码指令中通过编号引用到产量池的过程称为符号引用。
3、字段
当前类或接口声明的字段信息。
- 字节码中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法的Code属性中。
4、方法
当前类或接口声明的方法信息字节码指令
5、属性
类的属性、比如源码的文件名内部类的列表等。
三、常用的字节码工具
1、javap -v 命令
- javap是JDK自带的反编译工具,可以通过控制台查看字节码文件内容。适合在服务器上查看字节码文件内容。
- 直接输入javap查看所有参数。
- 输入javap -v 字节码文件名称查看具体的字节码信息。(如果jar包需要先使用jar -vxf命令解压)。
2、jclasslib插件
- jclasslib也有idea插件版本,建议开发时使用idea插件版本,可以在代码编译之后实时看到字节码文件内容。
3、阿里arthas
- Arthas是一款线上监控诊断产品,通过全局视角实时查看应用load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,大大提升线上问题排查效率。
- 官网:https://arthas.aliyun.com/doc/quick-start.html
- dump 类的权限定名:dump已加载类的字节码文件到特定目录。
- jad 类的权限定名:反编译已加载的源码。