Java 基础 - javap 反编译命令

Posted frank_cui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 基础 - javap 反编译命令相关的知识,希望对你有一定的参考价值。

总结

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

javap的用法格式:

javap <options> <classes>

其中classes就是你要反编译的class文件。 在命令行中直接输入javap或javap -help可以看到javap的options有如下选项:

-help  --help  -?        输出此用法消息
 -version                 版本信息,其实是当前javap所在jdk的版本信息,不是class在哪个jdk下生成的。
 -v  -verbose             输出附加信息(包括行号、本地变量表,反汇编等详细信息)
 -l                         输出行号和本地变量表
 -public                    仅显示公共类和成员
 -protected               显示受保护的/公共类和成员
 -package                 显示程序包/受保护的/公共类 和成员 (默认)
 -p  -private             显示所有类和成员
 -c                       对代码进行反汇编
 -s                       输出内部类型签名
 -sysinfo                 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)
 -constants               显示静态最终常量
 -classpath <path>        指定查找用户类文件的位置
 -bootclasspath <path>    覆盖引导类文件的位置

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

  • javap -v classxx,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
  • javap -l 会输出行号和本地变量表信息。
  • javap -c 会对当前class字节码进行反编译生成汇编代码。

 

详细解析请看: 通过javap命令分析java汇编指令

 

javap 分析装箱拆箱

关于equals比较

double i0 = 0.1;
Double i1 = new Double(0.1);
Double i2 = new Double(0.1);
System.out.println(i1.equals(i2)); //true 2个包装类比较,比较的是包装的基本数据类型的值

//javap 分析这句话
System.out.println(i1.equals(i0)); //true 基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较

 

基本数据类型和包装类比较时,会先把基本数据类型包装成对应的包装类型,再进行比较。这一点可以通过查看.class字节码来证明:

 

 

关于 == 比较

对于基本数据类型,==(双等号)比较的是值,而对于包装类型,==(双等号)比较的则是2个对象的内存地址。

double i0 = 0.1;
Double i1 = new Double(0.1);
Double i2 = new Double(0.1);
System.out.println(i1 == i2);    //false new出来的都是新的对象

//javap 分析这句话
System.out.println(i1 == i0);    //true 基本数据类型和包装类比较,会先把包装类拆箱

 

基本数据类型和包装类型比较时,会先把包装类拆箱再进行值比较(和equals是反的)。这个也可以通过查看字节码来证明:

以上是关于Java 基础 - javap 反编译命令的主要内容,如果未能解决你的问题,请参考以下文章

Java命令学习系列:Javap(转)

java命令:javac/java/javap

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

# JVM 参数及调优

javap命令详解

javap命令详解