JVM学习-javap解析Class文件

embedded/2024/10/22 16:27:03/
解析字节码的作用
  • 通过反编译生成字节码文件,可以深入了解Java工作机制,但自己分析类文件结构太麻烦,除了第三方的jclasslib工具外,官方提供了javap
  • javap是jdk自带的反解析工具,它的作用是根据class字节码文件,反解析出当前类对应的code区(字节码指令)、局部变量表、异常表、代码行偏移量映射表、常量池等信息
  • 通过局部变量表,可以查看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用信息
java_g_4">java -g操作
  • 解析字节码文件得到的信息中,有些信息(如局部变量表、指令和代码行偏移量映射表、常量池中方法的参数名称等)需要在使用javac编译成class文件时,指定参数才能输出
  • 直接使用javac xx.java,不会生成对应局部变量表等信息,使用javac -g xx.java可以生成相关信息,如使用eclipse或IDEA,默认情况下,在编译时会帮你生成局部变量表,指令和代码偏移量映射表等信息
javap_7">javap
  • classes是要反编译的class文件
  • 在命令行直接输入javap或javap -help可以看到javap的options有如下选项
    在这里插入图片描述
java">C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -version JavapTest.class
1.8.0_131
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();int getNum(int);protected char showGender();public void showInfo();static {};
}// -public 显示公共信息
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -public JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();public void showInfo();
}
// -protected 
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -protected JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();protected char showGender();public void showInfo();
}
// -private || -p  大于或等于private权限
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -private JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {private int num;boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();private com.chapter09.JavapTest(boolean);private void methodPrivate();int getNum(int);protected char showGender();public void showInfo();static {};
}
// -package     显示非私有的信息
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -package JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();int getNum(int);protected char showGender();public void showInfo();static {};
}
// -sysinfo
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -sysinfo JavapTest.class
Classfile /C:/Users/Administrator/IdeaProjects/jvm/target/classes/com/chapter09/JavapTest.class     //字节码文件路径Last modified 2024-5-27; size 1348 bytes             //日期MD5 checksum 85dc41e7e2e7128d8899b5d131d7975f       //MD5散列Compiled from "JavapTest.java" 
public class com.chapter09.JavapTest {boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();int getNum(int);protected char showGender();public void showInfo();static {};
}
// -constants
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -constants JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS = 1;public com.chapter09.JavapTest();int getNum(int);protected char showGender();public void showInfo();static {};
}
// -s 输出内部类型签名
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -s JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {boolean flag;descriptor: Zprotected char gender;descriptor: Cpublic java.lang.String info;descriptor: Ljava/lang/String;public static final int COUNTS;descriptor: Ipublic com.chapter09.JavapTest();descriptor: ()Vint getNum(int);descriptor: (I)Iprotected char showGender();descriptor: ()Cpublic void showInfo();descriptor: ()Vstatic {};descriptor: ()V
}
// -l 输出行号和本地变量表
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -l JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();LineNumberTable:line 20: 0line 18: 4line 20: 10LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   Lcom/chapter09/JavapTest;int getNum(int);LineNumberTable:line 26: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       7     0  this   Lcom/chapter09/JavapTest;0       7     1     i   Iprotected char showGender();LineNumberTable:line 29: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/chapter09/JavapTest;public void showInfo();LineNumberTable:line 32: 0line 33: 3line 34: 30LocalVariableTable:Start  Length  Slot  Name   Signature0      31     0  this   Lcom/chapter09/JavapTest;3      28     1     i   Istatic {};LineNumberTable:line 15: 0line 16: 3LocalVariableTable:Start  Length  Slot  Name   Signature
}
// -c 对代码进行反编译
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -l JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();LineNumberTable:line 20: 0line 18: 4line 20: 10LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   Lcom/chapter09/JavapTest;int getNum(int);LineNumberTable:line 26: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       7     0  this   Lcom/chapter09/JavapTest;0       7     1     i   Iprotected char showGender();LineNumberTable:line 29: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/chapter09/JavapTest;public void showInfo();LineNumberTable:line 32: 0line 33: 3line 34: 30LocalVariableTable:Start  Length  Slot  Name   Signature0      31     0  this   Lcom/chapter09/JavapTest;3      28     1     i   Istatic {};LineNumberTable:line 15: 0line 16: 3LocalVariableTable:Start  Length  Slot  Name   Signature
}C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -c JavapTest.class
Compiled from "JavapTest.java"
public class com.chapter09.JavapTest {boolean flag;protected char gender;public java.lang.String info;public static final int COUNTS;public com.chapter09.JavapTest();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: ldc           #2                  // String java7: putfield      #3                  // Field info:Ljava/lang/String;10: returnint getNum(int);Code:0: aload_01: getfield      #5                  // Field num:I4: iload_15: iadd6: ireturnprotected char showGender();Code:0: aload_01: getfield      #6                  // Field gender:C4: ireturnpublic void showInfo();Code:0: bipush        102: istore_13: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;6: new           #8                  // class java/lang/StringBuilder9: dup10: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V13: aload_014: getfield      #3                  // Field info:Ljava/lang/String;17: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;20: iload_121: invokevirtual #11                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;24: invokevirtual #12                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;27: invokevirtual #13                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V30: returnstatic {};Code:0: ldc           #14                 // String www.lotus.com2: astore_03: return
}
// -v 显示最全的字节码反编译数据
C:\Users\Administrator\IdeaProjects\jvm\target\classes\com\chapter09>javap -v JavapTest.class
Classfile /C:/Users/Administrator/IdeaProjects/jvm/target/classes/com/chapter09/JavapTest.class         //位置Last modified 2024-5-27; size 1348 bytes             //日期,大小MD5 checksum 85dc41e7e2e7128d8899b5d131d7975f        //MD5散列值Compiled from "JavapTest.java"
public class com.chapter09.JavapTestminor version: 0                     //副版本号major version: 52                   //主版本号flags: ACC_PUBLIC, ACC_SUPER           //访问标识
Constant pool:#1 = Methodref          #16.#46        // java/lang/Object."<init>":()V#2 = String             #47            // java#3 = Fieldref           #15.#48        // com/chapter09/JavapTest.info:Ljava/lang/String;#4 = Fieldref           #15.#49        // com/chapter09/JavapTest.flag:Z#5 = Fieldref           #15.#50        // com/chapter09/JavapTest.num:I#6 = Fieldref           #15.#51        // com/chapter09/JavapTest.gender:C#7 = Fieldref           #52.#53        // java/lang/System.out:Ljava/io/PrintStream;#8 = Class              #54            // java/lang/StringBuilder#9 = Methodref          #8.#46         // java/lang/StringBuilder."<init>":()V#10 = Methodref          #8.#55         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;#11 = Methodref          #8.#56         // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;#12 = Methodref          #8.#57         // java/lang/StringBuilder.toString:()Ljava/lang/String;#13 = Methodref          #58.#59        // java/io/PrintStream.println:(Ljava/lang/String;)V#14 = String             #60            // www.lotus.com#15 = Class              #61            // com/chapter09/JavapTest#16 = Class              #62            // java/lang/Object#17 = Utf8               num#18 = Utf8               I#19 = Utf8               flag#20 = Utf8               Z#21 = Utf8               gender#22 = Utf8               C#23 = Utf8               info#24 = Utf8               Ljava/lang/String;#25 = Utf8               COUNTS#26 = Utf8               ConstantValue#27 = Integer            1#28 = Utf8               <init>#29 = Utf8               ()V#30 = Utf8               Code#31 = Utf8               LineNumberTable#32 = Utf8               LocalVariableTable#33 = Utf8               this#34 = Utf8               Lcom/chapter09/JavapTest;#35 = Utf8               (Z)V#36 = Utf8               methodPrivate#37 = Utf8               getNum#38 = Utf8               (I)I#39 = Utf8               i#40 = Utf8               showGender#41 = Utf8               ()C#42 = Utf8               showInfo#43 = Utf8               <clinit>#44 = Utf8               SourceFile#45 = Utf8               JavapTest.java#46 = NameAndType        #28:#29        // "<init>":()V#47 = Utf8               java#48 = NameAndType        #23:#24        // info:Ljava/lang/String;#49 = NameAndType        #19:#20        // flag:Z#50 = NameAndType        #17:#18        // num:I#51 = NameAndType        #21:#22        // gender:C#52 = Class              #63            // java/lang/System#53 = NameAndType        #64:#65        // out:Ljava/io/PrintStream;#54 = Utf8               java/lang/StringBuilder#55 = NameAndType        #66:#67        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;#56 = NameAndType        #66:#68        // append:(I)Ljava/lang/StringBuilder;#57 = NameAndType        #69:#70        // toString:()Ljava/lang/String;#58 = Class              #71            // java/io/PrintStream#59 = NameAndType        #72:#73        // println:(Ljava/lang/String;)V#60 = Utf8               www.lotus.com#61 = Utf8               com/chapter09/JavapTest#62 = Utf8               java/lang/Object#63 = Utf8               java/lang/System#64 = Utf8               out#65 = Utf8               Ljava/io/PrintStream;#66 = Utf8               append#67 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;#68 = Utf8               (I)Ljava/lang/StringBuilder;#69 = Utf8               toString#70 = Utf8               ()Ljava/lang/String;#71 = Utf8               java/io/PrintStream#72 = Utf8               println#73 = Utf8               (Ljava/lang/String;)V
{ //-----------------------------------------------方法
//字段表集合信息boolean flag;          //字段名descriptor: Z        //字段描述符(字段类型)flags:               //字段访问标识protected char gender;descriptor: Cflags: ACC_PROTECTEDpublic java.lang.String info;descriptor: Ljava/lang/String;flags: ACC_PUBLICpublic static final int COUNTS;descriptor: Iflags: ACC_PUBLIC, ACC_STATIC, ACC_FINALConstantValue: int 1                             //常量字段的属性:ConstantValue,保存常量的值
//-----------------------------------------------方法public com.chapter09.JavapTest();descriptor: ()Vflags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: ldc           #2                  // String java7: putfield      #3                  // Field info:Ljava/lang/String;10: returnLineNumberTable:line 20: 0line 18: 4line 20: 10LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   Lcom/chapter09/JavapTest;int getNum(int);descriptor: (I)Iflags:Code:stack=2, locals=2, args_size=20: aload_01: getfield      #5                  // Field num:I4: iload_15: iadd6: ireturnLineNumberTable:line 26: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       7     0  this   Lcom/chapter09/JavapTest;0       7     1     i   Iprotected char showGender();descriptor: ()Cflags: ACC_PROTECTEDCode:stack=1, locals=1, args_size=10: aload_01: getfield      #6                  // Field gender:C4: ireturnLineNumberTable:line 29: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/chapter09/JavapTest;public void showInfo();descriptor: ()V                                   //方法描述符:方法的形参列表、返回值类型flags: ACC_PUBLIC                                 //方法的访问标识Code:                                             //方法Code属性stack=3, locals=2, args_size=1                  //stack:操作数栈的最大深度,locals:局部变量表的长度,args_size:方法接收参数的个数//偏移量  操作码        操作数0: bipush        102: istore_13: getstatic     #7 //#7常量表索引                  // Field java/lang/System.out:Ljava/io/PrintStream;6: new           #8                  // class java/lang/StringBuilder9: dup10: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V13: aload_014: getfield      #3                  // Field info:Ljava/lang/String;17: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;20: iload_121: invokevirtual #11                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;24: invokevirtual #12                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;27: invokevirtual #13                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V30: returnLineNumberTable:             //行号表,当前字节码指令偏移量与Java源程序中代码的行号一一对应关系line 32: 0line 33: 3line 34: 30LocalVariableTable:          //局部变量表,描述内部局部变量的相关信息Start  Length  Slot  Name   Signature0      31     0  this   Lcom/chapter09/JavapTest;3      28     1     i   Istatic {};descriptor: ()Vflags: ACC_STATICCode:stack=1, locals=1, args_size=00: ldc           #14                 // String www.lotus.com2: astore_03: returnLineNumberTable:line 15: 0line 16: 3LocalVariableTable:Start  Length  Slot  Name   Signature
}
SourceFile: "JavapTest.java"                         //附加属性:当前字节码对应的源文件的文件名

http://www.ppmy.cn/embedded/43091.html

相关文章

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片 1.背景2.接口 1.背景 System.Drawing.Common 是一个用于图像处理和图形操作的库&#xff0c;它是 System.Drawing 命名空间的一部分。由于 .NET Core 和 .NET 5 的跨平台特性&#xff0c;许多以前内置于 .NET Framework…

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式&#xff0c;共十一种&#xff1a;…

在某云服务器上搭建公网kali linux2.0

前提&#xff1a; 可用的 CVM 实例 挂载一个系统盘之外的盘&#xff0c;安装完成后可卸载&#xff01; 创建实例&#xff0c;安装centos7系统&#xff01; 然后执行fdisk -l看磁盘的情况 在这里我将把镜像写入vdb这块数据盘 非 root 的情况下记得sudo执行以下命令 注意&…

Pycharm最新安装教程(最新更新时间2024年5月27日)

ps&#xff1a;本教程Pycharm安装&#xff0c;最新更新时间&#xff1a;2024年5月27日&#xff0c;公众号持续更新关注公众号防失联哦 Pycharm 再次更新了一个小版本。又回到老话题&#xff0c;2023.3.2这个版本是否还能安装&#xff0c;笔者也亲测了一下。还是沿用本站之前的…

01.爬虫---初识网络爬虫

01.初识网络爬虫 1.什么是网络爬虫2.网络爬虫的类型3.网络爬虫的工作原理4.网络爬虫的应用场景5.网络爬虫的挑战与应对策略6.爬虫的合法性总结 1.什么是网络爬虫 网络爬虫&#xff0c;亦称网络蜘蛛或网络机器人&#xff0c;是一种能够自动地、系统地浏览和收集互联网上信息的程…

【selenium】自动化测试chrome webdriver驱动下载网址,V123版本以上

Hi&#xff0c;大家好&#xff0c;今天和大家分享下最新的selenium自动化测试&#xff0c;chrome浏览器驱动下载的最新地址 chrome webdriver下载网址&#xff0c;适用于浏览器版本V123以上

isscc2024 short course2 Performance Compute Environment

这部分分为4部分&#xff1a; 概览&#xff1a;LLMs和生成式AI 探讨大语言模型&#xff08;LLMs&#xff09;和生成式AI的整体环境&#xff0c;及其对硬件加速器设计的影响。 高性能AI加速器的特定考虑因素 广泛的模型和使用案例支持&#xff1a;需要设计能支持多种模型和应…

TransFormer学习之VIT算法解析

1.算法简介 本文主要对VIT算法原理进行简单梳理&#xff0c;下图是一个大佬整理的网络整体的流程图&#xff0c;清晰明了&#xff0c;其实再了解自注意力机制和多头自注意力机制后&#xff0c;再看VIT就很简单了 受到NLP领域中Transformer成功应用的启发&#xff0c;ViT算法尝…