欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

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

时间:2022-10-12 10:05:03|栏目: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 8 52
J2SE 7 51
J2SE 6.0 50
J2SE 5.0 49
JDK 1.4 48
JDK 1.3 47
JDK 1.2 46
JDK 1.1 45

上一篇:JAVA构造器是否为静态方法你知道吗

栏    目:JAVA代码

下一篇:Java几个实例带你进阶升华上篇

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

本文地址:http://www.codeinn.net/misctech/216166.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有