一、javap是什么?

javap是将字节码进行反编译(与javac对应),可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。

二、javap的使用

➜ ~ javap -help

用法: javap

其中, 可能的选项包括:

-help --help -? 输出此用法消息

-version 版本信息

-v -verbose 输出附加信息

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

-public 仅显示公共类和成员

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

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

和成员 (默认)

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

-c 对代码进行反汇编

-s 输出内部类型签名

-sysinfo 显示正在处理的类的

系统信息 (路径, 大小, 日期, MD5 散列)

-constants 显示最终常量

-classpath 指定查找用户类文件的位置

-cp 指定查找用户类文件的位置

-bootclasspath 覆盖引导类文件的位置

➜ ~ javap -version //输出jdk版本

1.8.0_131

示例代码如下:

1 package com.meituan.mtlearner.cheetah.service.test;

2

3 public class CommonTest {

4 private String name;

5

6 public static void main(String[] args) throws Exception{

7 String a = "222";

8 System.out.println(a);

9 throw new Exception();

10 }

11 }

➜ test javap -v CommonTest //和javap -verbose一样,输出额外信息

警告: 二进制文件CommonTest包含com.meituan.mtlearner.cheetah.service.test.CommonTest

Classfile /Users/shichangmin/workspace/cheetah/target/classes/com/meituan/mtlearner/cheetah/service/test/CommonTest.class

Last modified May 21, 2018; size 727 bytes

MD5 checksum 7110663fa12a58f7d74917d709a67c66

Compiled from "CommonTest.java"

public class com.meituan.mtlearner.cheetah.service.test.CommonTest

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #8.#26 // java/lang/Object."":()V

#2 = String #27 // 222

#3 = Fieldref #28.#29 // java/lang/System.out:Ljava/io/PrintStream;

#4 = Methodref #30.#31 // java/io/PrintStream.println:(Ljava/lang/String;)V

#5 = Class #32 // java/lang/Exception

#6 = Methodref #5.#26 // java/lang/Exception."":()V

#7 = Class #33 // com/meituan/mtlearner/cheetah/service/test/CommonTest

#8 = Class #34 // java/lang/Object

#9 = Utf8 name

#10 = Utf8 Ljava/lang/String;

#11 = Utf8

#12 = Utf8 ()V

#13 = Utf8 Code

#14 = Utf8 LineNumberTable

#15 = Utf8 LocalVariableTable

#16 = Utf8 this

#17 = Utf8 Lcom/meituan/mtlearner/cheetah/service/test/CommonTest;

#18 = Utf8 main

#19 = Utf8 ([Ljava/lang/String;)V

#20 = Utf8 args

#21 = Utf8 [Ljava/lang/String;

#22 = Utf8 a

#23 = Utf8 Exceptions

#24 = Utf8 SourceFile

#25 = Utf8 CommonTest.java

#26 = NameAndType #11:#12 // "":()V

#27 = Utf8 222

#28 = Class #35 // java/lang/System

#29 = NameAndType #36:#37 // out:Ljava/io/PrintStream;

#30 = Class #38 // java/io/PrintStream

#31 = NameAndType #39:#40 // println:(Ljava/lang/String;)V

#32 = Utf8 java/lang/Exception

#33 = Utf8 com/meituan/mtlearner/cheetah/service/test/CommonTest

#34 = Utf8 java/lang/Object

#35 = Utf8 java/lang/System

#36 = Utf8 out

#37 = Utf8 Ljava/io/PrintStream;

#38 = Utf8 java/io/PrintStream

#39 = Utf8 println

#40 = Utf8 (Ljava/lang/String;)V

{

public com.meituan.mtlearner.cheetah.service.test.CommonTest();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

LineNumberTable:

line 3: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this Lcom/meituan/mtlearner/cheetah/service/test/CommonTest;

public static void main(java.lang.String[]) throws java.lang.Exception;

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=2, args_size=1

0: ldc #2 // String 222

2: astore_1

3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;

6: aload_1

7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

10: new #5 // class java/lang/Exception

13: dup

14: invokespecial #6 // Method java/lang/Exception."":()V

17: athrow

LineNumberTable: //代码中的行数对应code中的序号,例如示例代码的第7行(String a = "222";)对应Code块中的0号(idc #2 //String 222)

line 7: 0

line 8: 3

line 9: 10

LocalVariableTable: //局部变量表,列出了所有栈帧中的局部变量

Start Length Slot Name Signature

0 18 0 args [Ljava/lang/String;

3 15 1 a Ljava/lang/String;

Exceptions:

throws java.lang.Exception

}

SourceFile: "CommonTest.java"

➜ test javap -l CommonTest

警告: 二进制文件CommonTest包含com.meituan.mtlearner.cheetah.service.test.CommonTest

Compiled from "CommonTest.java"

public class com.meituan.mtlearner.cheetah.service.test.CommonTest {

public com.meituan.mtlearner.cheetah.service.test.CommonTest();

LineNumberTable:

line 3: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this Lcom/meituan/mtlearner/cheetah/service/test/CommonTest;

public static void main(java.lang.String[]) throws java.lang.Exception;

LineNumberTable:

line 7: 0

line 8: 3

line 9: 10

LocalVariableTable:

Start Length Slot Name Signature

0 18 0 args [Ljava/lang/String;

3 15 1 a Ljava/lang/String;

}

➜ test javap -c CommonTest

警告: 二进制文件CommonTest包含com.meituan.mtlearner.cheetah.service.test.CommonTest

Compiled from "CommonTest.java"

public class com.meituan.mtlearner.cheetah.service.test.CommonTest {

public com.meituan.mtlearner.cheetah.service.test.CommonTest();

Code:

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

public static void main(java.lang.String[]) throws java.lang.Exception;

Code:

0: ldc #2 // String 222

2: astore_1

3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;

6: aload_1

7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

10: new #5 // class java/lang/Exception

13: dup

14: invokespecial #6 // Method java/lang/Exception."":()V

17: athrow

}

基本上javap -v就包含了所有的反编译信息,如果觉得不够,就增加个help里面的标签就好了。

其实通过javap -v展示的内容不难看出字节码文件的组成:最后修改时间,文件大小、MD5签名、全限定名、版本、访问权限标签、常量池、成员变量信息、方法信息、属性信息等。(http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html)

而每个方法都包含至少三部分:签名、访问权限符、Code,Code中又包含指令集、对应信息、局部变量表。

对照书本上或者一些文档中的字节码文件的组成,通过javap这个小工具来了解字节码文件(.class)更直观一些。

java 分析命令_javap命令解析相关推荐

  1. Alian解读SpringBoot 2.6.0 源码(三):启动流程分析之命令行参数解析

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.默认应用参数解析 2.1.接口ApplicationArguments 2.2.实现类DefaultApplicationArgu ...

  2. JAVA分析命令:jps、jstack、jmap、jhat

    JAVA分析命令:jps.jstack.jmap.jhat jps 用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等.与unix上的ps类似,用来显示本地有 ...

  3. golang flag包(命令行参数解析)

    1.1 使用示例: 我们以 nginx 为例,执行 nginx -h,输出如下: nginx version: nginx/1.10.0 Usage: nginx [-?hvVtTq] [-s sig ...

  4. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

  5. 第1阶段——uboot分析之查找命令run_command函数和命令定义过程(6)

    本节主要学习,run_command函数命令查找过程,命令生成过程 1.run_command函数命令查找过程分析: 在u-boot界面中(main_loop();位于u-boot-1.1.6/com ...

  6. 安装rpm包命令_编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出...

    不常用R的朋友,可能并不能意识到好的编辑模板带来的长期效率提高和代码重用性,非计算机专业科研人员且需要使用R语言,此文会对您有帮助. 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与 ...

  7. 【Redis源码分析】Redis命令处理生命周期

    运营研发团队 李乐 前言 本文主要讲解服务器处理客户端命令请求的整个流程,包括服务器启动监听,接收命令请求并解析,执行命令请求,返回命令回复等,这也是本文的主题"命令处理的生命周期" ...

  8. jenkins java反序列化_Jenkins “Java 反序列化”过程远程命令执行漏洞

    ###漏洞原理 反序列化是指特定语言中将传递的对象序列化数据重新恢复为实例对象的过程,而在这个过程中会执行一系列的字节流解析和对象实例化操作用于恢复之前序列化时的对象.在原博文所提到的那些 Java ...

  9. java调用命令行命令_Java命令行界面(第4部分):命令行

    java调用命令行命令 我的Java命令行解析系列的第四部分介绍了Commandline ,它被描述为 "用于解析命令行参数的Java库",它"基于使用注释从命令行参数到 ...

最新文章

  1. 在js中使用HashMap数据结构,在js中使用K,V数据结构
  2. webview 加载php页面内容,WebView加载优化的方法介绍
  3. Visual Studio 2017开发linux程序使用实例及原理简析
  4. poi 启用保护后取消_雪佛龙取消商标许可,澳洲加德士更名Ampol后启用新LOGO
  5. 提升PHP性能的21种方法
  6. 洛谷P4219 大融合(LCT、虚子树)
  7. Java校招笔试题-Java基础部分(二)
  8. 移动电子商务,“移动”至生活
  9. 人工智能离前端并不远 一步步教你开发一个机器学习APP(附源码)
  10. 故障:“远程计算机需要网络级别身份验证
  11. Linux进阶之排错
  12. android 编程输入系统时间,基于android和PC的时间事件记录实践
  13. NVelocity条件选择语法
  14. (超详细,避免踩坑)如何使用freeMaker模板生成器处理图片以及文字替换
  15. java毕业设计C语言教学辅导网站Mybatis+系统+数据库+调试部署
  16. 计算机中的查找快捷键,Excel搜索快捷键如何在excel中快速找到所需信息
  17. BZOJ 2339 卡农(组合数学)
  18. java九宫格案例讲解_Java实现九宫格的教程详解
  19. 周问题回复-滤波器-锁相环BL参数及环路滤波器参数问题
  20. 什么是 480i、576i、480p、1080i、720p?什么是 HDTV?

热门文章

  1. Java springboot项目引入腾讯云COS实现上传
  2. 《人民的名义》达康书记的同款火了,另一爆款“天网工程”你也有
  3. JSON序列化以及JSON反序列
  4. JAVA中JSON序列化和反序列化
  5. 【C语言】循环链表解决约瑟夫环问题
  6. HM编码器代码阅读(38)——帧内预测(五)帧内预测之正式的预测操作
  7. java花括号_Java初始化对象 两个花括号{{}}
  8. 处理Activity#onResume()遇到java.lang.IllegalArgumentException诡异异常
  9. 量子优势_我是亲民_新浪博客
  10. Vue2中使用百度脑图kityminder-core二次开发