IDEA 字节码学习查看神器 jclasslib bytecode viewer

WilliamGates
发布于 2023-10-8 11:03
浏览
0收藏

了不起最近发现一个好用的工具,对于学习 ​​Java​​​ 的同学来说,可以很好的帮助我们理解和学习字节码,下面就给大家介绍一个 ​​IDEA​​​ 的字节码学习神器 ​​jclasslib bytecode viewer​​ 插件。

下载安装

首先我们在 ​​IDEA​​​ 的插件市场中搜索  ​​jclasslib bytecode viewer​​​ 和进行下载安装,安装过后根据 ​​IDEA​​ 版本的不同,可能需要重启才能使用。

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

使用

下载安装过后,在我们的项目中,首先先将整个项目进行编译,编译的作用是将 ​​.java​​​ 文件编译成 ​​.class​​​ 文件,对应菜单栏为 ​​build => build project​​​。然后找到我们需要查询字节码的文件,在菜单栏中点击 ​​view => show bytecode with Jclasslib​​ 即可打开字节码窗口。

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

jclasslib

通过上面打开的字节码窗口,可以看到很多信息,下面来依次看一下,

通用信息 General Information

在通用信息里面主要有一些类的通用信息,如下所示

  1. 版本号(Version Number): 这部分由次版本号和主版本号组成,用于确定编译进字节码的 Java 版本;
  2. 常量池大小
  3. 类的访问权限:此部分指定了与类或接口关联的访问权限(例如 public,private)和其他属性(例如,是类或接口,是否定义为 abstract,如果是类,是否被标记为 final);
  4. 此类与超类(This Class & Super Class): 分别表示这个类本身和它的父类;
  5. 字段表(Fields Table): 描述类或接口声明的变量部分。
  6. 方法表(Methods Table): 包含该类或接口的所有方法的描述。
  7. 属性表(Attributes Table): 描述有关字段,方法和类的更多信息,例如代码实际的字节码,常量字段的值等。

常量池

在通用信息下面的是常量池,常量池是 ​​Java Class​​​ 文件、运行时常量池在​​ JVM​​​ 规范中非常关键的一部分。用更简单地话来说,常量池就是一个存储常量的地方,包含了一个 ​​Java​​ 类或接口所需要的字面量和符号引用。字面量包括各种基本类型的常量和字符串常量,符号引用包括类、字段和方法的引用。

这些常量包括:

  • 类和接口的全限定名
  • 字段的名称和描述符
  • 方法的名称和描述符
  • 常量值,如文字字符串

所有的字面量和符号引用在 ​​Class​​​ 文件中都是以常量池的形式存储的。常量池就像是 ​​Class​​​ 文件的资源仓库,比如说 ​​Java​​​ 类中定义的很多字符串、数字和引用类型都是作为常量项存储到常量池中。其实,常量池的主要目标是为JVM在运行期间提供所需的信息。字节码文件被加载到 ​​JVM​​ 时,会将这些符号引用解析为直接引用(地址)。

举个例子,当编译器遇到一个方法调用时,如 ​​obj.method()​​​,​​JVM​​​ 规范要求在常量池中创建一个 ​​Methodref ​​​常量。这个 ​​Methodref​​​会包含对当前类的符号引用和这个方法的名字及描述符。当 JVM 在运行时解析这个 ​​Methodref ​​​常量时,如果 ​​obj ​​​是一个符号引用,那么​​JVM​​​ 会第一次通过符号引用使用其 ​​Fully Qualified Class Name​​ 查找类。

在 ​​JVM​​ 中,每一个加载的类型(类或接口)都有一个常量池,当这个类型被加载到 JVM 级别后,这个常量池将成为运行时常量池,在执行类中的代码时会使用到这个常量池。

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

字段 Fields

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

在字段表下面会有所有的类属性字段,在右侧会有引用地址和访问权限。

方法表 Methods

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

在方法表这里会列出所有的方法,包括类的无参构造方法以及字段的初始化方法,这里我们可以着重看一下 main 方法的字节码,在我们的源代码中的 main 函数里面有一个循环,在右侧字节码中我们可以看到 28 行有一个 goto 2 可以猜测到就是进入下一次循环。

再依次对应源代码和指令我们可以大概的猜测到具体的指令的含义,比如 istore 存储,iload 加载,bipush 压栈,iadd 相加,iinc 累加 等。对于每个指令我们可以点击查看对应的手册,通过手册我们可以知道对应指令的含义。

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区

通过字节码我们可以看到在 for 循环底层有一个 if 比较的指令,在每个循环中进行条件判断。

属性 Attributes

这里的属性是一些描述有关字段,方法和类的更多信息,例如代码实际的字节码,常量字段的值等,不是类的字段属性。这里因为测试用例比较简单,所以只是有源代码一个属性。

IDEA 字节码学习查看神器 jclasslib bytecode viewer-鸿蒙开发者社区


文章转载自公众号:Java极客技术

标签
已于2023-10-8 11:03:19修改
收藏
回复
举报
回复
    相关推荐