oracle官方的反解析工具:javap详解

1、解析字节码的作用

通过反编译生成的字节码文件,我们可以深入的了解java代码的工作机制。但是,自己分析类文件结构太麻烦了!除了使用第三方的jclasslib工具之外,oracle官方也提供了工具:javap

javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(字节码指令)、局部变量表、异常表和代码行偏移量映射表、常量池等信息。

通过局部变量表,我们可以查看局部变量的作用域范围、所在槽位等信息,甚至可以看到槽位复用等信息。

2、javac -g操作

解析字节码文件得到的信息中,有些信息(如局部变量表、指令和代码行偏移量映射表、常量池中方法的参数名称等等)需要在使用javac编译成class文件时,指定参数才能输出

比如,你直接javac xx.java,就不会在生成对应的局部变量表等信息,如果你使用javac -g xx.java就可以生成所有相关信息了。如果你使用的eclipse或IDEA,则默认情况下,eclipse、IDEA在编译时会帮你生成局部变量表、指令和代码行偏移量映射表等信息的。

3、javap的用法

javap的用法格式:javap <options> <classes>

其中,classes就是你要反编译的class文件

在命令行中直接输入javap或javap -help可以看到javap的options有如下选项:

image-20231125162530698

这里重组一下:

 -help  --help  -?      输出此用法消息-version               版本信息,其实是当前javap所在jdk的版本信息,不是class在哪个jdk下生成的。-public                仅显示公共类和成员-protected             显示受保护的/公共类和成员-p  -private           显示所有类和成员-package               显示程序包/受保护的/公共类 和成员 (默认)-sysinfo               显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列,源文件名)-constants             显示静态最终常量-s                     输出内部类型签名-l                     输出行号和本地变量表-c                     对代码进行反汇编-v  -verbose           输出附加信息(包括行号、本地变量表,反汇编等详细信息)-classpath <path>      指定查找用户类文件的位置-cp <path>             指定查找用户类文件的位置-bootclasspath <path>  覆盖引导类文件的位置

一般常用的是-v -l -c三个选项。
javap -l 会输出行号和本地变量表信息。
javap -c 会对当前class字节码进行反编译生成汇编代码。
javap -v classxx 除了包含-c内容外,还会输出行号、局部变量表信息、常量池等信息。

4、使用举例

public class JavapTest {private int num;boolean flag;protected char gender;public String info;public static final int COUNTS = 1;static{String url = "www.atguigu.com";}{info = "java";}public JavapTest(){}private JavapTest(boolean flag){this.flag = flag;}private void methodPrivate(){}int getNum(int i){return num + i;}protected char showGender(){return gender;}public void showInfo(){int i = 10;System.out.println(info + i);}
}

希望输出的信息比较完整的话,使用如下操作:javap -v -p JavapTest.class

对应的内容信息为:
Classfile /C:/Users/songhk/Desktop/2/JavapTest.classLast modified 2020-9-6; size 1358 bytesMD5 checksum 526b4a845e4d98180438e4c5781b7e88Compiled from "JavapTest.java"
public class com.atguigu.java1.JavapTestminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #16.#46        // java/lang/Object."<init>":()V#2 = String             #47            // java#3 = Fieldref           #15.#48        // com/atguigu/java1/JavapTest.info:Ljava/lang/String;#4 = Fieldref           #15.#49        // com/atguigu/java1/JavapTest.flag:Z#5 = Fieldref           #15.#50        // com/atguigu/java1/JavapTest.num:I#6 = Fieldref           #15.#51        // com/atguigu/java1/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.atguigu.com#15 = Class              #61            // com/atguigu/java1/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/atguigu/java1/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.atguigu.com#61 = Utf8               com/atguigu/java1/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
{private int num;descriptor: Iflags: ACC_PRIVATEboolean flag;descriptor: Zflags: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 1public com.atguigu.java1.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 22: 10LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   Lcom/atguigu/java1/JavapTest;private com.atguigu.java1.JavapTest(boolean);descriptor: (Z)Vflags: ACC_PRIVATECode:stack=2, locals=2, args_size=20: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: ldc           #2                  // String java7: putfield      #3                  // Field info:Ljava/lang/String;10: aload_011: iload_112: putfield      #4                  // Field flag:Z15: returnLineNumberTable:line 23: 0line 18: 4line 24: 10line 25: 15LocalVariableTable:Start  Length  Slot  Name   Signature0      16     0  this   Lcom/atguigu/java1/JavapTest;0      16     1  flag   Zprivate void methodPrivate();descriptor: ()Vflags: ACC_PRIVATECode:stack=0, locals=1, args_size=10: returnLineNumberTable:line 28: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       1     0  this   Lcom/atguigu/java1/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 30: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       7     0  this   Lcom/atguigu/java1/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 33: 0LocalVariableTable:Start  Length  Slot  Name   Signature0       5     0  this   Lcom/atguigu/java1/JavapTest;public void showInfo();descriptor: ()Vflags: ACC_PUBLICCode:stack=3, locals=2, args_size=10: 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: returnLineNumberTable:line 36: 0line 37: 3line 38: 30LocalVariableTable:Start  Length  Slot  Name   Signature0      31     0  this   Lcom/atguigu/java1/JavapTest;3      28     1     i   Istatic {};descriptor: ()Vflags: ACC_STATICCode:stack=1, locals=1, args_size=00: ldc           #14                 // String www.atguigu.com2: astore_03: returnLineNumberTable:line 15: 0line 16: 3LocalVariableTable:Start  Length  Slot  Name   Signature
}
SourceFile: "JavapTest.java"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/231217.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对二分搜索的理解 Go语言版

二分搜索大家都很熟悉&#xff0c;首先我们先来看看基本框架 func binarySearch(nums []int, target int) int {left, right : 0, ...for ... {mid : left (right-left)/2if nums[mid] target {...} else if nums[mid] < target {left ...} else if nums[mid] > targ…

一文详解Python中常用数据类型

文章目录 Python 中常用的数据类型包括&#xff1a;Python 中布尔类型(bool)Python 中的数字类型概述Pyhon中的字符串概述Python 中的List概述Python 中的元组类型(tuple)Python中的字典&#xff08;Dictionary&#xff09;Python中的集合&#xff08;Set&#xff09;Python中的…

JavaScript基础知识总结

1.前提 Html是一种标记语言&#xff0c;用来结构化我们的网页内容并赋予内容含义&#xff0c;例如定义段落、标题和数据表&#xff0c;或在页面中嵌入图片和视频 Css是一种样式规则语言&#xff0c;可将样式应用于 HTML 内容&#xff0c;例如设置背景颜色和字体&#xff0c;在多…

事件代理?

1.什么是事件代理&#xff1f; 事件代理也叫事件委托&#xff0c;只指定一个事件处理程序&#xff0c;就可以管理某一类型得事件。 可以简单理解为&#xff0c;事件代理就是将本应该绑定子元素事件绑定给父元素代理。它的优点就是&#xff1a;减少事件得执行&#xff0c;减少浏…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

Linux 进程(二)

1.当前工作目录 Linux 下使用 ls /proc 查看程序中的进程&#xff0c;其中这些蓝色的数字代表的就是进程。 其中cwd(current working directory)就是当前工作目录&#xff0c;那么为什么cwd 和 exe 是在同一级目录下呢因为 进程需要依赖可执行程序&#xff0c;可执行程序需要依…

FPGA设计时序约束十、others类约束之Set_Disable_Timing

目录 一、序言 二、Set Disable Timing 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时…

合阔智云:实现API无代码开发,连接ERP系统和CRM系统提高运营效率

概述 合阔智云&#xff0c;一家成立于2011年的科技公司&#xff0c;核心业务是提供云原生和移动化设计的新一代全渠道“云端一体”履约中台和去中心化模式智能门店供应链业务中台。他们的系统可以无需API开发即可实现电商系统和客服系统的连接和集成&#xff0c;大大提高了企业…

Egg.js中Cookie和Session

Cookie HTTP请求是无状态的&#xff0c;但是在开发时&#xff0c;有些情况是需要知道请求的人是谁的。为了解决这个问题&#xff0c;HTTP协议设计了一个特殊的请求头&#xff1a;Cookie。服务端可以通过响应头&#xff08;set-cookie&#xff09;将少量数据响应给客户端&#…

基于单片机智能电子密码锁设计

**单片机设计介绍&#xff0c;基于单片机智能电子密码锁设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能电子密码锁设计是一种利用单片机&#xff08;如Arduino、Raspberry Pi等&#xff09;和相关电子元件来…

VMware虚机重启后静态IP不生效

配置好一套虚机之后&#xff0c;因为重启电脑&#xff0c;导致虚机的静态ip配置不生效&#xff0c;xshell连接不上虚机。以下是自查和解决方案&#xff1a; 1.使用su -进入root用户 2.查看打开虚机的teminal窗口查看配置的ip文件&#xff1a;vim /etc/sysconfig/network-script…

第八天:信息打点-系统端口CDN负载均衡防火墙

信息打点-系统篇&端口扫描&CDN服务&负载均衡&WAF防火墙 一、知识点 1、获取网络信息-服务器厂商&#xff1a; 阿里云&#xff0c;腾讯云&#xff0c;机房内部等。 网络架构&#xff1a; 内外网环境。 2、获取服务信息-应用协议-内网资产&#xff1a; FTP…