,,详解JDK自带javap命令反编译class文件和Jad反编译class文件(推荐使用jad)

,,详解JDK自带javap命令反编译class文件和Jad反编译class文件(推荐使用jad)

本文主要介绍JDK自己的javap命令反编译类文件和jad反编译类文件(推荐使用Jad)。这篇文章给你做了非常详细的介绍,对你的学习或者工作有一定的参考价值。有需要的朋友可以参考一下。

:

目录

1.前言2。编写java文件3。理解补充代码4。javap命令5。执行javap命令6。正在下载Jad包1。正在下载URL 2。解压缩到指定的目录3。配置环境变量4。查看常用命令5。练习命令7。总结一下。

一、前言

在我们的日常学习中,当我们遇到一个java代码的问题,不知道如何在jvm内部解析它的时候;反编译是一个伟大的壮举,因此您可以看到java文件是如何在jvm中被解析的!我们可以使用JDK自带的javap命令进行反编译。如果看不懂反编译版,可以用Jad工具配合。更何况是GD-GUI把jar包完全反编译成我们写的代码。有兴趣可以去官网看看。这里就不做进一步解释了。

JD-GUI官网下载地址。

今天我们用string string=新弦('王')新弦('甄');这个语句是如何在底层创建的,以深入理解jvm的底层,同时对反编译有进一步的了解!话不多说,跟边肖学。

二、编写java文件

公共类JavaPTest {

String string=新字符串(' learning ')新字符串(' Java ');

}

三、科补代码理解

上面的代码创建了5个对象,我们一步一步说吧!

首先,它将确定字符串常量池中是否有“学习”字符串对象,如果没有,它将在字符串常量池中创建一个对象。当执行new关键字时,在堆中创建一个“learn”字符串对象。下面的新字符串(' Java ')是相同的。

然后,当右侧完成时,将在堆中创建一个“学习Java”字符串对象。并将堆栈中的变量‘str 6’指向堆中的对象。

摘要:一段代码创建了五个对象,但是其中两个在堆中没有被引用。根据垃圾收集的可达性分析,它们是垃圾,即‘learning’和‘Java’。

内存如下:

边肖开始时,就有疑虑。为什么有五个?下面就让我们进一步探索吧!

四、javap命令

不懂任何命令的小伙伴,只要在cmd打开的窗口输入win R,输入javap就能看到内容。

C:\Users\Administratorjavap

用法:javap选项类

其中,可能的选项包括:

救命救命。输出这个用法信息。

-版本版本信息

-v-详细输出附加信息

-l输出行号和局部变量表

-public仅显示公共类和成员。

-protected显示受保护的/公共类和成员。

-package显示包/受保护的/公共类。

成员和(默认)

-p -private显示所有类和成员。

-c反汇编代码

-s输出内部类型签名

-sysinfo显示正在处理的类的。

系统信息(路径、大小、日期、MD5哈希)

-constants显示最终常数。

-classpath path指定在何处查找用户类文件。

-cp path指定在哪里可以找到用户类文件。

体验:javap -c -v类名。类是常用的。

示例:javap-c-v Java test . class

五、执行javap命令

在IDEA的java类中,按快捷键ctrl f9编译成类文件,为反编译做准备;

找到类文件的位置。

来到这个目录,没有光盘切换到这个目录。

进入javap-c-v Java test . class,反编译后可见,创建了五个对象。

六、下载Jad包

1. 网址下载

下载地址

2. 解压到指定目录

3. 配置环境变量

为什么要配置环境变量?

这样我们可以在任何地方使用cmd命令反编译,也是为了方便!

PS:JDK的人都知道配置路径。这里边肖就不带大家一步一步找配置的地方了,直接添加环境变量。

4. 常用命令查看

不知道有什么命令的小伙伴,直接温河输入煤矿管理局打开的窗口输入深长的掏槽即可看到一下内容

C:\Users\Administratorjad

Jad v1.5.8g版权所有2001年帕维尔库兹涅佐夫。com).

用法:jad[选项]文件名

选项:-一个-将虚拟机(Java Virtual Machine的缩写)指令生成为注释(注释)

-af -注释时输出完全限定的名称

-b -生成冗余大括号(大括号)

-安全-清除所有前缀,包括默认前缀

-d方向-输出文件的目录

-死了-尝试反编译代码的死部分(如果有的话)

-仅拆卸器(拆卸器)

-f -生成完全限定的名称(全名)

-ff -在方法之前输出字段(字段优先)

-我.打印字段的默认初始值设定项(定义)

-嗯-将字符串拆分成最大字符数(splitstr)个部分

-lnc -将原始行号作为注释输出(lnc)

-lradixnum-使用指定的基数显示长整数

-nl -在换行符上拆分字符串(splitstr)

诺康夫不要将Java 语言(一种计算机语言,尤用于创建网站)标识符转换成有效的标识符(诺康夫)

-不要播-不生成辅助强制转换

-没有阶级-不要转换。类运算符

-无代码-不为方法生成源代码

-夜行者-取消空构造函数

诺多斯关闭对以磁盘操作系统模式编写的类文件的检查

-没有-不要消除同名字段的歧义(诺夫尔迪斯)

-诺纳-关闭对内部类的支持

-诺维特-忽略局部变量表条目(nolvt)

-nonlb -不要在左大括号前插入换行符(非磅)

用作复合形式的末尾元音不经确认覆盖输出文件

-p -将所有输出发送到标准输出(用于管道)

-pa pfx-生成的源文件中所有包的前缀

-pc pfx-前缀,用于具有数字名称的类(默认为:_cls)

-pe pfx-未使用的异常名称的前缀(默认值:_ex)

pf pfx-带有数字名称的字段的前缀(默认值:_fld)

-pinum - pack使用10.5 *(打包端口)

-pl pfx-带有数字名称的局部变量的前缀(默认值:_lcl)

-pm pfx-带有数字名称的方法的前缀(默认值:_mth)

-pp pfx-带有数字名称的方法参数的前缀(默认值:_prm)

-pvnum -将相同类型的字段打包成一行(包装字段)

-r -恢复包目录结构

-radius num-使用指定的基数(8、10或16)显示整数

-s分机-输出文件扩展名(默认值:jad)

-安全-生成额外的强制转换以消除方法/字段的歧义

太空输出关键字(如果、虽然等)和表达式之间的空格

-统计-显示已处理的类/方法/字段的总数

-嗯-使用缩进的空格数(默认值:4)

-t -使用制表符代替空格进行缩进

-伏-反编译时显示方法名

-8 -将统一码字符串转换为美国国家标准学会字符串(ANSI)

- -将标准错误重定向到标准输出

小编这里就翻译了哈,常用的就是杰德-奥-普级文件名称

-o:无需确认直接覆盖输出

-p:直接反编译代码到输出到命令下(直接在界面显示)

5.实践命令

输入:jad -o JavaPTest,会在班级文件所在同一级命令生成。深长的掏槽文件,看的也比较清晰,我们使用工具打开:

//由Jad v1.5.8g反编译,版权所有2001年帕维尔库兹涅佐夫.

//Jad主页:http://www.kpdus.com/jad.html

//反编译器选项:pack ports(3)

//源文件名:JavaPTest.java

包com。王。测试。演示。普通;

公共类JavaPTest

{

公共JavaPTest()

{

string=(new StringBuilder()).追加(新字符串('王'))。追加(新字符串(“zhjen”).toString();

}

字符串string;

}

enter:jad-o-p Java test,这也是五个对象的一个更简单的版本。你不需要像上面那样打开文件就能看到。

七、总结

这样,我们就完成了类文件的反编译。两种方法各有利弊,要根据实际情况进行反编译。总而言之,这两种方法一定要掌握!

关于JDK用javap命令反编译类文件和jad反编译类文件(推荐使用Jad)的文章到此结束。关于JDK用javap反编译类文件的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: