如何使用IDEA查看java文件编译后的字节码内容

 更新时间:2022年03月12日 14:37:08   作者:morningcat2018  
这篇文章主要介绍了如何使用IDEA查看java文件编译后的字节码内容,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

首先编写一个java类 StringDemo1.java

public class StringDemo1 {
   public static void main(String[] args) {
       String str1 = "aaa" + "bbb";
       System.out.println(str1);
       String str2 = "ccc";
       str2 += "ddd";
       System.out.println(str2);
   }
}

经过编译后,生成 StringDemo1.class文件

使用IDEA查看编译之后的文件内容:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package jdk.java.lang.string;
public class StringDemo1 {
   public StringDemo1() {
   }
   public static void main(String[] args) {
       String str1 = "aaabbb";
       System.out.println(str1);
       String str2 = "ccc";
       str2 = str2 + "ddd";
       System.out.println(str2);
   }
}

可以看出内容已经是经过IDEA反编译之后的了,并不能看到字节码内容。

使用jclasslib反编译工具

在IDEA中搜索插件jclasslib bytecode viewer,然后进行安装,重启IDEA。

再次打开StringDemo1.java文件,在IDEA菜单栏上打开View -> Show Bytecode,即可以看到字节码文件内容:

// class version 52.0 (52)
// access flags 0x21
public class jdk/java/lang/string/StringDemo1 {
 // compiled from: StringDemo1.java
 // access flags 0x1
 public <init>()V
  L0
   LINENUMBER 8 L0
   ALOAD 0
   INVOKESPECIAL java/lang/Object.<init> ()V
   RETURN
  L1
   LOCALVARIABLE this Ljdk/java/lang/string/StringDemo1; L0 L1 0
   MAXSTACK = 1
   MAXLOCALS = 1
 // access flags 0x9
 public static main([Ljava/lang/String;)V
  L0
   LINENUMBER 11 L0
   LDC "aaabbb"
   ASTORE 1
  L1
   LINENUMBER 12 L1
   GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
   ALOAD 1
   INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
  L2
   LINENUMBER 15 L2
   LDC "ccc"
   ASTORE 2
  L3
   LINENUMBER 16 L3
   NEW java/lang/StringBuilder
   DUP
   INVOKESPECIAL java/lang/StringBuilder.<init> ()V
   ALOAD 2
   INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   LDC "ddd"
   INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
   ASTORE 2
  L4
   LINENUMBER 17 L4
   GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
   ALOAD 2
   INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
  L5
   LINENUMBER 18 L5
   RETURN
  L6
   LOCALVARIABLE args [Ljava/lang/String; L0 L6 0
   LOCALVARIABLE str1 Ljava/lang/String; L1 L6 1
   LOCALVARIABLE str2 Ljava/lang/String; L3 L6 2
   MAXSTACK = 2
   MAXLOCALS = 3
}

以上编译内容是我在JDK1.8u202环境下进行编译的,所以开头才会有class version 52.0 (52)的标识。

至于字节码怎么读,就需要继续学习;

Java虚拟机规范中有关于Java虚拟机指令集的相关资料,可以学习研究一下。

随后还可以学习一下ASM技术(Java字节码操控框架);

JDK版本映射

JDK版本class版本
J2SE 852
J2SE 751
J2SE 6.050
J2SE 5.049
JDK 1.448
JDK 1.347
JDK 1.246
JDK 1.145

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring事务处理流程和原理详解

    Spring事务处理流程和原理详解

    这篇文章主要介绍了Spring事务处理流程和原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java面向对象之继承、构造方法、重写、重载

    Java面向对象之继承、构造方法、重写、重载

    本章具体介绍了什么是构造方法、继承、重写、重载以及创建方法,整篇文章用老司机和人类来举例,图解穿插代码案例,需要的朋友可以参考下
    2023-03-03
  • mybatis中sql语句CDATA标签的用法说明

    mybatis中sql语句CDATA标签的用法说明

    这篇文章主要介绍了mybatis中sql语句CDATA标签的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 一文解读Spring Bean的生命周期

    一文解读Spring Bean的生命周期

    这篇文章主要给大家详细解读Spring Bean的生命周期,文中有详细的代码示例,对我们学习Spring Bean的生命周期有一定的帮助,感兴趣的同学跟着小编一起来学习吧
    2023-07-07
  • Spring Boot LocalDateTime格式化处理的示例详解

    Spring Boot LocalDateTime格式化处理的示例详解

    这篇文章主要介绍了Spring Boot LocalDateTime格式化处理的示例详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Java实现的打地鼠小游戏完整示例【附源码下载】

    Java实现的打地鼠小游戏完整示例【附源码下载】

    这篇文章主要介绍了Java实现的打地鼠小游戏,结合完整实例形式分析了Java多线程操作及键盘按键响应实现的打地鼠游戏功能相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • Springboot jar文件如何打包zip在linux环境运行

    Springboot jar文件如何打包zip在linux环境运行

    这篇文章主要介绍了Springboot jar文件如何打包zip在linux环境运行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java异常类型及处理

    Java异常类型及处理

    这篇文章主要介绍了Java异常出现原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • idea远程Debug部署在服务器上的服务

    idea远程Debug部署在服务器上的服务

    在开发的时候我们通常在本地代码上debug程序,但是服务部署到了开发环境服务器上,如何远程调试,本文主要介绍了idea远程Debug部署在服务器上的服务,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Java后端Tomcat实现WebSocket实例教程

    Java后端Tomcat实现WebSocket实例教程

    WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成握手。本文给大家介绍Java后端Tomcat实现WebSocket实例教程,感兴趣的朋友一起学习吧
    2016-05-05

最新评论