前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IDEA 字节码学习查看神器 jclasslib bytecode viewer

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

作者头像
Java极客技术
发布2023-09-02 15:33:03
3460
发布2023-09-02 15:33:03
举报
文章被收录于专栏:Java极客技术Java极客技术

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

下载安装

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

使用

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

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 级别后,这个常量池将成为运行时常量池,在执行类中的代码时会使用到这个常量池。

字段 Fields

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

方法表 Methods

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

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

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

属性 Attributes

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java极客技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载安装
  • 使用
  • jclasslib
    • 通用信息 General Information
    • 常量池
    • 字段 Fields
    • 方法表 Methods
    • 属性 Attributes
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档