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 反编译命令的主要内容,如果未能解决你的问题,请参考以下文章