欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容

 更新時間:2022年03月12日 14:37:08   作者:morningcat2018  
這篇文章主要介紹了如何使用IDEA查看java文件編譯后的字節(jié)碼內(nèi)容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

首先編寫一個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);
? ?}
}

經(jīng)過編譯后,生成 StringDemo1.class文件

使用IDEA查看編譯之后的文件內(nèi)容:

//
// 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);
? ?}
}

可以看出內(nèi)容已經(jīng)是經(jīng)過IDEA反編譯之后的了,并不能看到字節(jié)碼內(nèi)容。

使用jclasslib反編譯工具

在IDEA中搜索插件jclasslib bytecode viewer,然后進行安裝,重啟IDEA。

再次打開StringDemo1.java文件,在IDEA菜單欄上打開View -> Show Bytecode,即可以看到字節(jié)碼文件內(nèi)容:

// 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
}

以上編譯內(nèi)容是我在JDK1.8u202環(huán)境下進行編譯的,所以開頭才會有class version 52.0 (52)的標識。

至于字節(jié)碼怎么讀,就需要繼續(xù)學(xué)習(xí);

Java虛擬機規(guī)范中有關(guān)于Java虛擬機指令集的相關(guān)資料,可以學(xué)習(xí)研究一下。

隨后還可以學(xué)習(xí)一下ASM技術(shù)(Java字節(jié)碼操控框架);

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論