java javap_javap的用途不断发展:您的Java类文件中隐藏了什么?

java javap

什么是Javap,如何使用它以及何时要反汇编类文件?

作为Java开发工具包(JDK)的一部分,我们可以使用许多工具,这些工具有助于更好地理解Java代码。 这些工具之一是javap命令,它使我们能够在后台传递Java类文件。

在下面的文章中,我们将研究javap,了解它如何帮助我们并确切地了解我们如何使用它。 代码,反汇编!

什么是javap?

javap是一个命令行工具,可分解Java类文件:它分解了我们的类文件,并揭示了其中的内容。 该工具将二进制格式的类文件转换为人类可读的代码。 好吧,对于某些人。

javap提供了许多输出,这些输出根据我们感兴趣的数据而有所不同。默认情况下,javap打印每个类的非私有成员的声明。

至于javap中的p代表什么,所有证据都指向“打印”,因为javap命令会打印出类中的字节码。

我们可以使用javap的一种好方法是探索异常。 如果您想提高自己的知识并了解引发异常时会发生什么,请查看我们的帖子,了解有关Java异常的令人惊讶的真相 。

在我们的类中使用javap

既然我们知道了javap是什么,该是在我们的代码上尝试使用它的时候了。 我们通过键入命令,选择一个选项并添加类名称来做到这一点:

javap [选项]类名

正如我们指出的,这些选项(也可以称为标志)将决定我们的输出是什么。 我们可以从许多标志中进行选择,包括:

  • -l –输出行和局部变量表
  • -public –仅显示公共班级和成员
  • -protected –仅显示受保护的和公开的班级和成员
  • -package –仅显示软件包,受保护的和公共的类和成员
  • -p –显示所有班级和成员
  • -Jflag –将标志直接传递到运行时系统
  • -s –打印内部类型签名
  • -sysinfo –显示正在处理的类的系统信息(路径,大小,日期,MD5哈希)
  • -constants –显示静态最终常量
  • -c –打印反汇编的代码
  • -verbose –打印堆栈大小,方法的局部变量和args

用javap深入字节码

在列出了可以使用javap进行的操作之后,现在该弄清楚它的实际工作方式了。 为此,我们创建了一个名为ExampleClass的基本类:

public class ExampleClass
{private int a = 0;private int b = 0;public static void main(String[] args) {System.out.println("Hello world!");}
}

现在让我们在javap的帮助下更深入地研究它。 首先,我们将使用不带任何其他标志的javap命令来打印出非私有成员。 我们的输出是这样的:

$ javap ExampleClassCompiled from "ExampleClass.java"
public class ExampleClass {public ExampleClass();public static void main(java.lang.String[]);
}

如您所见,这是原始代码的漂亮“普通”视图,没有有关私有整数和逻辑的任何信息。 这是一个好的开始,但是如果我们想更深入地了解该怎么办? 让我们尝试使用-c打印出反汇编的代码:

$ javap -c ExampleClassCompiled from "ExampleClass.java"
public class ExampleClass {public ExampleClass();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: iconst_06: putfield      #2                  // Field a:I9: aload_010: iconst_011: putfield      #3                  // Field b:I14: returnpublic static void main(java.lang.String[]);Code:0: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #5                  // String Hello world!5: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: return
}

现在,我们以某种有点可读的形式保存了字节码,可以在其中识别我们的方法,整数,命令和字符串。 但是,等等,还有更多。 如果我们需要有关该课程的更多信息怎么办? 那是我们冗长的标志可以帮助我们的地方:

$ javap -v ExampleClassClassfile /Users/es/ExampleClass.classLast modified May 22, 2017; size 496 bytesMD5 checksum 7d29362228a3128e67b0c20c8bb54ee1Compiled from "ExampleClass.java"
public class ExampleClassSourceFile: "ExampleClass.java"minor version: 0major version: 51flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #8.#20         //  java/lang/Object."<init>":()V#2 = Fieldref           #7.#21         //  ExampleClass.a:I#3 = Fieldref           #7.#22         //  ExampleClass.b:I#4 = Fieldref           #23.#24        //  java/lang/System.out:Ljava/io/PrintStream;#5 = String             #25            //  Hello world!#6 = Methodref          #26.#27        //  java/io/PrintStream.println:(Ljava/lang/String;)V#7 = Class              #28            //  ExampleClass#8 = Class              #29            //  java/lang/Object#9 = Utf8               a#10 = Utf8               I#11 = Utf8               b#12 = Utf8               <init>#13 = Utf8               ()V#14 = Utf8               Code#15 = Utf8               LineNumberTable#16 = Utf8               main#17 = Utf8               ([Ljava/lang/String;)V#18 = Utf8               SourceFile#19 = Utf8               ExampleClass.java#20 = NameAndType        #12:#13        //  "<init>":()V#21 = NameAndType        #9:#10         //  a:I#22 = NameAndType        #11:#10        //  b:I#23 = Class              #30            //  java/lang/System#24 = NameAndType        #31:#32        //  out:Ljava/io/PrintStream;#25 = Utf8               Hello world!#26 = Class              #33            //  java/io/PrintStream#27 = NameAndType        #34:#35        //  println:(Ljava/lang/String;)V#28 = Utf8               ExampleClass#29 = Utf8               java/lang/Object#30 = Utf8               java/lang/System#31 = Utf8               out#32 = Utf8               Ljava/io/PrintStream;#33 = Utf8               java/io/PrintStream#34 = Utf8               println#35 = Utf8               (Ljava/lang/String;)V
{public ExampleClass();flags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: iconst_06: putfield      #2                  // Field a:I9: aload_010: iconst_011: putfield      #3                  // Field b:I14: returnLineNumberTable:line 1: 0line 3: 4line 4: 9public static void main(java.lang.String[]);flags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=1, args_size=10: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #5                  // String Hello world!5: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnLineNumberTable:line 7: 0line 8: 8
}

很多行在我们面前展开。 我们可以看到以下内容:

1.元数据–此类文件的位置,上次修改时间以及具有其唯一ID的类哈希
2.常量池–结构表,它引用ClassFile结构及其子结构中的各种常量。 它保存类,接口,类实例,字段名称,字符串常量或数组的符号信息。
3.字节码–用JVM可以“读取”的语言编写的指令集

在OverOps,我们使用javap作为研究工具来挖掘类内部。 我们最近使用它来发现IBM J9的工作方式,为使用此JVM的开发人员提供支持。 如果您想了解更多有关我们如何帮助团队减少调试时间并知道代码在何时何地中断的原因, 请单击此处以安排演示 。

现在我们知道了如何使用javap,是时候回答一个重要的问题了:

到底有什么好处呢?

Javap很酷,特别是如果您是像我们这样的数据迷并且想知道代码背后发生了什么时。 但是除了不错的代码探索冒险外,它也非常有用。

对于原始源代码不可用的情况,它可能会派上用场,其中显示了可以使用的方法。 它还可以帮助找出别人的代码或3rd party类中的内容。

我们还可以将javap用作Java类的类验证器,以确保每个加载的类文件都以适当的方式进行结构化。

刚开始,javap就像是一根魔杖,可以在代码内为我们提供所有信息,但它并不是对我们所面临的每个问题的完整解决方案。 它可能会帮助“逆向工程”某些代码,但这更多是一个复杂难题的线索。

如果您正在寻找一种将javap字节码输出转换为功能性Java代码的方法,而不仅仅是“数据列表”,那么您将需要反编译工具(如JD , Mocha等)的帮助。

最后的想法

尽管您不会经常使用它,但是javap是一个有用的工具,请牢记。 除了它是一个很酷的“技巧”之外,它还更深入地介绍了Java代码,向我们展示了幕后发生的事情以及JVM如何使用我们的代码。

翻译自: https://www.javacodegeeks.com/2017/06/javap-usage-unfolds-whats-hidden-inside-java-class-files.html

java javap

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

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

相关文章

虚拟内存越大越好吗_手机的运行内存真的是越大越好吗?6GB和8GB到底又该如何选择?...

许多人买手机&#xff0c;除了看处理器、外观以外&#xff0c;关注最多的莫过于手机的运行内存了。选择一个合适的运行内存几乎关系到整个手机使用寿命和命脉。那么我们现在买手机选择多大的运行内存合适呢&#xff1f;真的是越大越好吗&#xff1f;下面我们就来一起看看吧。选…

Adobe PhotoShop(PS) for Windows 快捷键/PS快捷键

文章目录一、工具栏二、文件操作三、选择功能四、视图操作五、编辑操作六、图像调整七、图层操作一、工具栏 功能说明快捷键备注移动工具V矩形、椭圆选框工具M套索、多边形套索、磁性套索L快速选择工具、魔棒工具W裁剪、透视裁剪、切片、切片选择工具C吸管、颜色取样器、标尺、…

kafka和storm集成_Storm和Kafka集成的重要生产错误和修复

kafka和storm集成我将在此处描述Storm和Kafka集成模块的一些细节&#xff0c;一些您应该意识到的重要错误以及如何克服其中的一些错误&#xff08;尤其是对于生产安装&#xff09;。 我在生产安装中大量使用Apache Storm&#xff0c;并将Kafka作为主要输入源&#xff08;Spout…

显微镜自动聚焦原理是什么_什么是共聚焦显微镜?你了解过共聚焦显微镜吗?...

更出色的表面分析ZEISS Smartproof 5产品表面粗糙度质量控制ZEISS Smartproof 5是一款集成式转盘共聚焦显微镜&#xff0c;依托孔径关联技术将传统共聚焦显微镜的高分辨率与转盘系统的高速采集相结合&#xff0c;能够高速、准确地采集表面3D数据。二维测量&#xff1a;距离、高…

java string args_java – 语法“final String … args”是什么意思/做什么?

Java中参数的省略号表示类型的vararg.因此,在您的情况下,…意味着您可以将任意数量的String参数传递给doInBackground方法.因此,您可以调用此方法doInBackground(“String1”,“String2”,“String3”)或doInBackground(“String1”)或doInBackground(“String1”,“String3”,…

Java 程序执行过程的内存流程图(手写稿)

操作系统会分配一定的内存空间给JVM&#xff0c;空间大小可以在JVM里面设置&#xff0c;JVM会将内存分为三个区域&#xff1a;栈、堆、方法区。

unsafe jdk9_JDK 9清单:Project Jigsaw,sun.misc.Unsafe,G1,REPL等

unsafe jdk9Java 9距离&#xff08;希望&#xff09;数月了&#xff0c;现在该回顾一下即将发生的变化以及您应该采取的措施 Java 9即将来临&#xff08;我们正在计算到达的日子 &#xff09;&#xff0c;其中包含一系列新功能和改进功能。 这就是为什么我们决定创建一份清单来…

DAO 学习笔记

文章目录什么是 DAO?如何写 DAO?示例代码什么是 DAO? Data Access Object(DAO)&#xff0c;数据访问对象/数据存取对象。DAO 是封装数据库访问逻辑的组件/类 。 定义一个类&#xff0c;这个类中的方法封装了数据库访问逻辑&#xff0c;要访问数据库时&#xff0c;只要调用…

dc/os_DC / OS中具有Java和数据库应用程序的服务发现

dc/os该博客将展示一个简单的Java应用程序如何使用DC / OS中的服务发现与数据库进行对话。 为什么要进行服务发现&#xff1f; 应用程序通常由多个组件组成&#xff0c;例如应用程序服务器&#xff0c;数据库&#xff0c;Web服务器&#xff0c;缓存和消息传递服务器。 通常&am…

python进阶项目设计_Python进阶循环设计

之前在“循环”一节&#xff0c;我们已经讨论了Python最基本的循环语法。这一节&#xff0c;我们将接触更加灵活的循环方式。1. 利用range(), 得到下标在Python中&#xff0c;for循环后的in跟随一个序列的话&#xff0c;循环每次使用的序列元素&#xff0c;而不是序列的下标。之…

python调试器入门教程_PyCharm入门第一步(二)——调试第一个Python应用|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/第2步&#xff1a;调试您的第一个Python应用程序找出问题的根源PyCharm报告运行时错误&#xff1a;a ZeroDivisionError。深入研究一下代码&#xff0c;找出问题所在。这里可以使用PyCharm调试器来查看代码中发生了什么。要开始…

Struts2请求处理的内部流程图/结构图/原理图(版本二)

文章目录请求处理流程图流程说明请求处理流程图 流程说明 第 1 步&#xff1a; 客户端初始化一个指向 Servlet 容器&#xff08;例如 Tomcat&#xff09;的请求&#xff0c;例如&#xff1a;在浏览器中输入 http:localhost:8080/Struts2/helloworld/helloworldAction.action …

jboss 配置上下文路径_为单个Web应用程序配置多个上下文根– JBoss

jboss 配置上下文路径有时&#xff0c;我们通过在jboss-web.xm l中定义一个来对应用程序进行更改&#xff0c;以支持利用JBoss功能的多个上下文根&#xff0c;如下所示&#xff1a; webapp / WEB-INF / jboss-web.xml&#xff1a; <?xml version"1.0" encoding…

xampp mysql 查询很慢_如何开启mysql的慢查询机制

1 在mysql中默认是不会开启慢查询日志功能的&#xff0c;我们可以使用show variables like ‘%slow%‘来查看一下。结果如下&#xff1a;参数说明&#xff1a;log_slow_queries表示服务器端是否开启慢查询日志记录功能&#xff0c;slow_query_log表示mysql监测满查询的功能是否…

python3.7打包exe坑_[求助]入坑学习python 需要装pyinstaller打包成exe

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼E:\Python>pyinstaller -F E:\Python\123.py142 INFO: PyInstaller: 3.2.1142 INFO: Python: 3.5.3142 INFO: Platform: Windows-7-6.1.7601-SP1143 INFO: wrote E:\Python\123.spec144 INFO: UPX is not available.146 INFO: E…

uaa 授权_使用UAA OAuth2授权服务器–客户端和资源

uaa 授权在上一篇文章中&#xff0c;我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器&#xff0c;以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它。 我在Digital Ocean网站上发现这篇文章在描述OAuth2授权代码流方面做得很好&#xff0c;因此&#xf…

谈谈Java编程中的拦截器与过滤器的区别

拦截器是基于 Java 反射机制的&#xff0c;而过滤器是基于函数回调的。 过滤器依赖于 Servlet 容器&#xff0c;而拦截器不依赖于 Servlet 容器。 拦截器只能对 Action 请求起作用&#xff0c;而过滤器则可以对几乎所有请求起作用。 拦截器可以访问 Action 上下文、值栈里的…

电影推荐系统 python简书_文章推荐系统 | 十四、推荐中心

在前面的文章中&#xff0c;我们实现了召回和排序&#xff0c;接下来将进入推荐逻辑处理阶段&#xff0c;通常称为推荐中心&#xff0c;推荐中心负责接收应用系统的推荐请求&#xff0c;读取召回和排序的结果并进行调整&#xff0c;最后返回给应用系统。推荐中心的调用流程如下…

获取请求的url java_Java获取此次请求URL以及服务器根路径的方法

一、 获取此次请求的URLString requestUrl request.getScheme() //当前链接使用的协议"://" request.getServerName()//服务器地址 ":" request.getServerPort() //端口号 request.getContextPath() //应用名称&#xff0c;如果应用名称为 request.getS…

java 平台级模块系统_Java平台模块系统公众审查未能通过

java 平台级模块系统在过去的几周里&#xff0c;Java世界中的戏剧&#xff0c;阴谋和政治活动异常高涨&#xff0c;最终在本周的JSR 376 Java平台模块系统公共评审投票中达到了顶峰。 Java模块化&#xff08;包括Java平台模块系统&#xff08;JPMS&#xff09;&#xff09;可以…