当前位置:首页 > 问答百科 > 正文内容

javap是什么(java中的反汇编指令)

福瑞号2022-12-16 18:56:15问答百科123
javap是什么(java中的反汇编指令)-图1
今日我们要了解的是java反汇编指令javap与java进程查看工具jps。
打开powershell客户端,输入“javap -help”,我们可以看到javap指令所能够搭配的参数:
javap是什么(java中的反汇编指令)-图2
这么多参数,我们只选其中最重要的了解就行。对于javap指令,我们需要了解的比较重要的指令有“-l”、“-c”、“-v”这三个。其它的指令大家可以自己在电脑上玩一玩。
我们先介绍“javap -l”。该指令搭配已经编译好的java字节码文件使用,运行后会输出一个“LineNumberTable”,这个行号表是用来描述java源代码文件与java字节码文件之间的对应关系,讲人话就是:A.java的第n行代码对应A.class文件的第m行,A.java的第x行代码对应A.class的第y行,也就是两个文件之间的对应关系,好比一篇中文文章被翻译成英文后,看不懂英文的童鞋想要知道英文某一行的意思,就需要这样一个表来与中文文章的行号做个对应。
我们在powershell客户端进入java文件所在的目录,运行“cat .\Test8.java”就可以看到java源代码:
javap是什么(java中的反汇编指令)-图3
我们再来运行“javap -l .\Test8.class”查看字节码的“ineNumberTable”:
javap是什么(java中的反汇编指令)-图4
控制台输出了源码行号和字节码行号的对应关系。我们再来运行“javap -c .\Test8.class”查看字节码的指令:
javap是什么(java中的反汇编指令)-图5
我们先逐行解读一下后一张图上的字节码信息。我们知道java程序通常从main方法开始执行,所以我们直接看源代码第9行,从行号表中的行号对应关系,我们知道源码第9行对应字节码第0行,在字节码mian方法的第0行是这样的:
0: getstatic #2 // Field log:Lorg/apache/commons/logging/Log;
getstatic意思是调用静态实例对象。看“//”后面的注释,意思是这个被调用的实例对象为“log”,它的类型是“org/apache/commons/logging/Log”。我们翻看源码第9行:log.info("48978798");
拿到log对象后,按照源码,接下来应该是调用info方法,但是调用该方法前必须先拿到方法的参数“48978798”。字节码中是这样的:3: ldc #3// String 48978798。
ldc意为从常量池取出常量。看注释:String 48978798。然后是调用info方法,可以在字节码第五行看到(该方法返回值类型为void):
5:invokeinterface#4,2//InterfaceMethod org/apache/commons/logging/Log.info:(Ljava/lang/Object;)V。
invokeinterface意思是调用接口,注释为调用的接口方法:Log接口的info方法。
下一行:
10: new #5 // class java/util/Random
我们查看行号表,发现字节码第十行和源码第十行对应。源码第十行是new了一个Random对象。这一行的字节码应该不需要我解释。接下来看字节码第14行:
14: invokespecial #6 // Method java/util/Random."<init>":()V
这个也很简单,意思是调用实例对象,从注释得知对象为Random类的对象。第17行是将该对象压栈内存。第18行是调用静态示例对象“System.out”,该对象的类型为一个打印流“PrintStream”:
18: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
从行号表我们也可以看到,字节码第18行对应源码第11行,我们自己的源码第11行是这样的:
System.out.println(random.nextInt(50));
得到打印流对象之后,接下来是调用该对象的println方法,同样的,在调用方法之前,我们需要先拿到方法的参数random.nextInt(50)。继续看字节码第24行:
24: invokevirtual #8 // Method java/util/Random.nextInt:(I)I
invokevirtual指令也就是调用方法,调用的方法是Random.nextInt,方法传入“I”,I在这里表示int,返回类型也是“I”,也就是整数。至此,我们已经有了打印流对象调用println方法的所有条件,下一步自然就是调用该方法进行打印输出了:
27: invokevirtual #9 // Method java/io/PrintStream.println:(I)V
又是一个invokevirtual指令,调用方法为println,传入参数类型为“I”,即传入了一个int类型整数,返回类型为“V”,即返回类型为“void”。我们从源码也能够证实我们的结论:
javap是什么(java中的反汇编指令)-图6
最后我们源码的第12行“}”对应了字节码的“return”,到此,方法执行完毕。
洋洋洒洒写了一大篇,小伙伴们如果没看懂,也没关系。只需要知道javap -c/-v指令展示了java虚拟机执行程序的过程,由于字节码文件对我们人类来说,可读性不高,所以使用javap来转换为我们可以读懂的指令,以方便我们分析我们的查询执行流程。而javap -l展示的源码与字节码的行号对应关系是在我们进行debug代码调试的时候,我们看到的是源码,程序运行的是编译好的字节码,这样就需要两者之间存在一种对应关系,方便我们调试代码。
好了,今天的介绍就到这里了。我们下期再见!
#编程语言#

扫描二维码推送至手机访问。

版权声明:本文由福瑞号发布,如需转载请注明出处。

本文链接:https://www.furui.com.cn/19329.html

标签: javap是什么

“javap是什么(java中的反汇编指令)” 的相关文章

元旦中的旦字代表什么意思(1月1日是元旦。“元”意思是“第一”)

元旦中的旦字代表什么意思(1月1日是元旦。“元”意思是“第一”)

蚂蚁新村每日一题:1月1日是元旦。“元"意思是"第一”,“旦"意思是 ?今天就是元旦佳节,大家知道元旦这两个词语的含义吗?小编给大家介绍元旦的含义。 蚂蚁新村小课堂问题: 1月1日是元旦元意思是第一旦意思是? 天黑 天亮 蚂蚁新村小课堂答案: 正确答案是:天亮 答案解析: 1月1日是元旦。元是“...

洛丽塔是什么意思(洛丽塔、JK制服、汉服)

洛丽塔是什么意思(洛丽塔、JK制服、汉服)

作为国内比较小众的圈子,近年来却越来越常见,我们经常在在大街上碰到,很多朋友也想穿,那么你真的了解它们吗? 洛丽塔 洛丽塔是什么?洛丽塔是一部小说的名字,这部小说讲的是关于恋童癖的故事,是反应西方社会现实的题材小说,洛丽塔在西方代表着少女穿成熟装扮,而当它来到了日本,日本人认为是可爱少女的意思,于是...

卧薪尝胆是谁(历史上卧薪尝胆的人物有哪些)

卧薪尝胆是谁(历史上卧薪尝胆的人物有哪些)

历史上卧薪尝胆的人物:1、勾践;2、韩信;3、司马迁;4、刘邦;5、秦孝公。该成语原意指越王勾践战败后以柴草卧铺,并经常舔尝苦胆,以时时警惕自己不忘所受苦难的故事,后形容人刻苦自励,发奋图强。 资料拓展1、勾践:越王勾践即位,同年,在檇李大败吴师。越王勾践三年(公元前494年),被吴军败于夫椒,被...

谁是著名小学语文特级教师(著名小学语文特级教师贾志敏逝世)

谁是著名小学语文特级教师(著名小学语文特级教师贾志敏逝世)

我国著名小学语文特级教师贾志敏先生因病医治无效,于2019年2月5日13:53分在上海不幸去世,享年81岁。2月6日,澎湃新闻(www.thepaper.cn)从贾志敏家属处获悉了这一消息。 贾志敏曾说:要当一个好的小学语文老师,需要一辈子的奋斗。 受访者供图 贾志敏儿子贾文骏告诉澎湃新闻,贾志敏...

鹰爪铁布衫结局(推荐十部冷门香港武侠电影)

鹰爪铁布衫结局(推荐十部冷门香港武侠电影)

1、《名剑》;谭家明的影坛处女作,极富古典气质的古装武侠片,格调和古装意境的呈现迥异于同时期强调视觉冲击力的硬派武侠,更多的是呈现人物之间情感关系的变化,而将打斗场面降到最低。一男两女之间的情感纠葛,那种暧昧的情愫,发乎情止乎礼的道德传统颇有古风。秋官的古装扮相俨然一副大侠模样,而徐少强的这种奸角形...

什么动物的眼睛最大(世界上眼睛占头部比例最大的四种动物)

什么动物的眼睛最大(世界上眼睛占头部比例最大的四种动物)

世界上眼睛比例最大的四种动物? 眼睛是心灵的窗口,也是动物最神秘的组织,动物要用眼睛寻找食物,还要用它们搜索环境,防止被敌害袭击。 为了看清周围的环境,大多数动物都长了锐利的眼睛。有些动物为了适应生活环境和飞行,能在黑夜和地下保持很好的视力。有动物的眼睛,视野很广,甚至能看清自己身后的情景。这里我们...