博客
关于我
JVM 学习笔记十九、javap命令的使用
阅读量:613 次
发布时间:2019-03-12

本文共 1109 字,大约阅读时间需要 3 分钟。

首图

十九、javap命令的使用

1、javap 的参数

image-20210507201823692

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

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

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

2、javap 的用法

一般常用的是-v -l -c三个选项。

  • javap -l 会输出行号和本地变量表信息。

  • javap -c 会对当前class字节码进行反编译生成汇编代码。

  • javap -v classxx除了包含一c内容外,还会输出行号、局部变量表信息、常量池等信息。

以如下代码为例来学习javap的使用方法

image-20210507202446355

javap -public JavapTest.class 显示公共信息

image-20210507202643233

javap -protected JavapTest.class 显示受保护的/公共类和成员

image-20210507202749379

javap -p(或-private) JavapTest.class 显示所有类和成员(大于private的)

image-20210507202919409

javap -package JavapTest.class 显示程序包/受保护的/公共类和成员(默认),非私有的信息

image-20210507203044607

javap -sysinfo JavapTest.class 显示正在处理的类的系统信息(路径,大小,日期,MD5 散列,源文件名)

image-20210507203239973

javap -constants JavapTest.class 与前面命令的主要区别,常量值会显示出来COUNTS = 1;

image-20210507203340849

字节码细节相关

  • -s 输出内部类型签名(描述符)

image-20210507204043618

  • -l 输出行号和本地变量表

image-20210507204127826

  • -c 对代码进行反汇编

image-20210507204251969

  • -v 或 -verbose 输出附加信息(包括行号、本地变量表、反汇编等详细信息),-v是最全的

image-20210507204347562

组合使用

-v 不包含私有信息,所以可以使用组合方式获取更全的信息 java -v -p JavapTest.class

image-20210507204503854

3、小结

  1. 通过javap命令可以查看一个java类反汇编得到的Class文件版本号、常量池、访问标识、变量表、指令代码行号表等等信息。不显示类索引、父类索引、接口索引集合、()、()等结构
  2. 通过对前面例子代码反汇编文件的简单分析,可以发现,一个方法的执行通常会涉及下面几块内存的操作:
    • java栈:局部变量表、操作数栈。
    • java堆:通过对象的地址引用去操作。
    • 常量池。

转载地址:http://fpwaz.baihongyu.com/

你可能感兴趣的文章
navicat 自动关闭_干掉Navicat!MySQL官方客户端到底行不行?
查看>>
Navicat 设置时间默认值(当前最新时间)
查看>>
navicat 连接远程mysql
查看>>
navicat:2013-Lost connection to MySQL server at ‘reading initial communication packet解决方法
查看>>
Navicate for mysql 数据库设计-数据库分析
查看>>
Navicat下载和破解以及使用
查看>>
Navicat中怎样将SQLServer的表复制到MySql中
查看>>
navicat创建连接 2002-can‘t connect to server on localhost(10061)且mysql服务已启动问题
查看>>
Navicat可视化界面导入SQL文件生成数据库表
查看>>
Navicat向sqlserver中插入数据时提示:当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值
查看>>
Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
查看>>
Navicat如何连接MySQL
查看>>
navicat导入.sql文件出错2006- MySQLserver has gone away
查看>>
Navicat导入海量Excel数据到数据库(简易介绍)
查看>>
Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)
查看>>
Navicat工具中建立数据库索引
查看>>
navicat工具查看MySQL数据库_表占用容量_占用空间是多少MB---Linux工作笔记048
查看>>
navicat怎么导出和导入数据表
查看>>
Navicat怎样同步两个数据库中的表
查看>>
Navicat怎样筛选数据
查看>>