1.javap命令是什么?
可以通过javap命令看到java程序在执行过程中,每一句代码真正地做了什么,包括cpu的指令和jvm具体做了什么,可以在发生一些错误或者奇怪的事情的时候,知道为什么会这样。
javap是jdk自带的反解析工具。作用是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。
这些信息当中,有些信息,比如本地变量表、指令和代码偏移映射表,常量池中的方法的参数名称等,需要在使用javac编译成class文件时,指定参数才能输出。使用javac -g xx.java就可以生成所有相关的信息了。
通过局部变量表,我们可以查看局部变量的作用域范围,所在槽位等信息,甚至可以看到槽位复用等信息。
javap的用法格式
javap
其中classes就是你要反编译的class文件。不需要带后缀.class。
命令行中直接输入javap或者javap -help可以看到javap的options:

用法: javap <options> <classes>
其中, 可能的选项包括:-help  --help  -?                输出此用法消息-version                         版本信息-v  -verbose                     输出附加信息-l                               输出行号和本地变量表-public                          仅显示公共类和成员-protected                       显示受保护的/公共类和成员-package                         显示程序包/受保护的/公共类和成员 (默认)-p  -private                     显示所有类和成员-c                               对代码进行反汇编-s                               输出内部类型签名-sysinfo                         显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)-constants                       显示最终常量--module <模块>, -m <模块>       指定包含要反汇编的类的模块--module-path <路径>             指定查找应用程序模块的位置--system <jdk>                   指定查找系统模块的位置--class-path <路径>              指定查找用户类文件的位置-classpath <路径>                指定查找用户类文件的位置-cp <路径>                       指定查找用户类文件的位置-bootclasspath <路径>            覆盖引导类文件的位置

一般常用的是-v -l -c三个选项
javap -v classxx,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
javap -l 会输出行号和本地变量表信息
javap -c 会对当前class字节码进行反编译生成汇编代码。
也可以通过jclasslib工具来看到上面的信息
2.一些测试
主要介绍code区(汇编指令)、局部变量表和代码偏移映射三个部分
创建一个TestDate.java文件

import java.util.Date;
public class TestDate {private int count = 0;public static void main(String[] args) {TestDate testDate = new TestDate();testDate.test1();}public void test1(){Date date = new Date();String name1 = "wangerbei";test2(date,name1); System.out.println(date+name1);}public void test2(Date dateP,String name2){dateP = null;name2 = "zhangsan";}public void test3(){count++;}public void  test4(){int a = 0;{int b = 0;b = a+1;}int c = a+1;}
}

使用命令:javac - g TestDate.java,生成一个TestDate.class文件
再使用javap命令对字节码文件进行反汇编,使用命令javap -c -l TestDate
此时不需要加后缀.class

Compiled from "TestDate.java"
public class TestDate {//默认的构造方法,在构造方法执行时完成一些初始化操作,包括一些成员变量的初始化赋值等public TestDate();Code:0: aload_0    //从本地变量表中加载索引为0的变量的值,也就是this的引用,压入栈1: invokespecial #1                  // 调用方法 java/lang/Object."<init>":()V 完成this对象的初始化4: aload_0  //5: iconst_06: putfield      #2                  // Field count:I9: returnLineNumberTable:line 2: 0line 4: 4LocalVariableTable:Start  Length  Slot  Name   Signature0      10     0  this   LTestDate;public static void main(java.lang.String[]);Code:0: new           #3                  // class TestDate3: dup4: invokespecial #4                  // Method "<init>":()V7: astore_18: aload_19: invokevirtual #5                  // Method test1:()V12: returnLineNumberTable:line 7: 0line 8: 8line 9: 12LocalVariableTable:Start  Length  Slot  Name   Signature0      13     0  args   [Ljava/lang/String;8       5     1 testDate   LTestDate;public void test1();Code:0: new           #6                  // class java/util/Date3: dup4: invokespecial #7                  // Method java/util/Date."<init>":()V7: astore_18: ldc           #8                  // String wangerbei10: astore_211: aload_012: aload_113: aload_214: invokevirtual #9                  // Method test2:(Ljava/util/Date;Ljava/lang/String;)V17: getstatic     #10                 // Field java/lang/System.out:Ljava/io/PrintStream;20: aload_121: aload_222: invokedynamic #11,  0             // InvokeDynamic #0:makeConcatWithConstants:(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;27: invokevirtual #12                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V30: returnLineNumberTable:line 12: 0line 13: 8line 14: 11line 15: 17line 16: 30LocalVariableTable:Start  Length  Slot  Name   Signature0      31     0  this   LTestDate;8      23     1  date   Ljava/util/Date;11      20     2 name1   Ljava/lang/String;public void test2(java.util.Date, java.lang.String);Code:0: aconst_null1: astore_12: ldc           #13                 // String zhangsan4: astore_25: returnLineNumberTable:line 19: 0line 20: 2line 21: 5LocalVariableTable:Start  Length  Slot  Name   Signature0       6     0  this   LTestDate;0       6     1 dateP   Ljava/util/Date;0       6     2 name2   Ljava/lang/String;public void test3();Code:0: aload_01: dup2: getfield      #2                  // Field count:I5: iconst_16: iadd7: putfield      #2                  // Field count:I10: returnLineNumberTable:line 24: 0line 25: 10LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   LTestDate;public void test4();Code:0: iconst_01: istore_12: iconst_03: istore_24: iload_15: iconst_16: iadd7: istore_28: iload_19: iconst_110: iadd11: istore_212: returnLineNumberTable:line 28: 0line 30: 2line 31: 4line 33: 8line 34: 12LocalVariableTable:Start  Length  Slot  Name   Signature4       4     2     b   I0      13     0  this   LTestDate;2      11     1     a   I12       1     2     c   I
}

参考资料:https://www.jianshu.com/p/6a8997560b05

javap命令解析字节码相关推荐

  1. python字节码解析_从底层入手,解析字节码增强和Btrace应用

    这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...

  2. java中用于运行字节码的命令_Java字节码指令

    1. 简介 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码)以及跟随其后的零至多个代表此操作所需参数(称为操作数)而构成. 由于Java虚拟机采用面向操作数栈而不是寄存 ...

  3. 通过javap命令分析jvm指令

    王二北原创,转载请标明出处:来自王二北 一.javap命令简述 javap是jdk自带的反解析工具.它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令).本地变量表.异常表 ...

  4. 【JVM】通过javap命令分析Java汇编指令

    文章目录 javap命令简述 javap测试及内容详解 例子1 例子2 总结 转载说明 javap命令简述 javap是jdk自带的反解析工具.它的作用就是根据class字节码文件,反解析出当前类对应 ...

  5. 通过javap命令分析java汇编指令

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

  6. 3种骚操作,教你查看 Java 字节码!

    在我们工作.学习.以及研究 JVM 过程当中,不可避免的要查看 Java 字节码,通过查看字节码可以了解一个类的编译结果,也能通过编译器层面来分析一个类的性能. 字节码文件是不能直接打开的,下面栈长教 ...

  7. JVM 调优实战--JVM字节码

    目录 通过javap命令查看class文件的字节码内容 常量池 ​描述符 字段描述符 方法描述符 解读方法字节码 图解 研究i++与++i的不同 查看字节码 对比 分析字符串拼接孰优孰劣 小结 通过j ...

  8. Java的 Class字节码文件结构和内容全面解析【两万字】

    了解Class文件的结构组成,对于我们后续的JVM以及Java原理深入学习是很有帮助的,因为Class文件帮我们默默的做了很多事,比如.为什么对象方法中可以直接使用this变量?!本文将带领大家,一步 ...

  9. java字节码文件结构解析

    目录 魔数与版本 常量池 类.父类和接口索引集合 字段表集合 方法表集合 属性表集合 Class文件(即字节码文件)以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列, 中间没有分隔符 ...

最新文章

  1. iOS开发中的 地区转经纬 经纬度转地区
  2. 2020 北京智源大会首日精华速递
  3. 远程实习 | 达特茅斯学院招收网络嵌入和图挖掘方向研究型实习生
  4. 父爱动画代码python_pygame用blit()实现动画效果的示例代码
  5. varnish介绍以及虚拟机的封装
  6. vue项目的一些需要注意到的细节
  7. 从一个帖子看 所谓“知乎” 的真实水平
  8. 作者:曾嘉(1980-),男,博士,华为诺亚方舟实验室高级研究员和项目经理。...
  9. ctfshow-WEB-web6
  10. x264源代码简单分析:x264_slice_write()
  11. Jdk1.6.0+Tomcat6.0环境变量配置
  12. android 新建签名文件注意事项
  13. 家庭财务软件的概要分析
  14. Linux USB 鼠标驱动程序详解
  15. 8086汇编段地址和偏移地址分配原则,深入理解.
  16. 【金融量化】我以为我是食物链顶层的收割者,想不到只是别人手中的镰刀
  17. 并发,同步,异步以及事件驱动编程的相关技术
  18. Definition of Dichotomy
  19. 21 python - 字典
  20. Pdftranspro简介

热门文章

  1. 点击图片后给你QQ留言的代码
  2. OpenCV中的超分辨率
  3. drawRect方法
  4. Access数据库防暴库技术
  5. Access 下载 爆库
  6. 截图像素大小和实际图片大小不同
  7. 身份证迎来电子身份证大变革
  8. C刷题:一个方法团灭LeetCode股票买卖问题
  9. git合并分支导致代码丢失问题,记录勉励自己
  10. html盒子模型图片居中,CSS盒模型和图片水平居中和垂直居中