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是反的)。这个也可以通过查看字节码来证明:

原文地址:https://www.cnblogs.com/frankcui/p/12134360.html

时间: 2024-07-31 00:37:57

Java 基础 - javap 反编译命令的相关文章

CFR - another java decompiler批量反编译jar文件(转)

CFR - another java decompiler批量反编译jar文件 jd-gui众所周知,业界公认的反编译必备工具. 笔者目前遇到一个java项目,社区版,想做一个本地化的版本,询问官方,官方说闭源,无奈之下只能反编译了. 面对那么多jar,jd-gui一个个去反编译保存,工作量的确很大.幸好在网上找到一个不错的工具 高能预警:jd-gui反编译的错误的,你敢不敢放到cfr来反编译试一试,保证有惊喜. CFR - another java decompiler 特性: CFR wil

IDEA设置External Tools之Javap反编译字节码

通过Jdk的命令javap可以反编译查看字节码,但是在使用idea的时候一直用命令行去操作不太好操作,而且因为idea会把class码 放在target里面,经常会忘记切换目录.这个时候idea的External Tools就派上用场了. 具体操作如下,先到idea的设置界面 进入Tools >  External Tools中 添加工具,分别设置program,argument等,其中arguments中是javap的参数,具体的参数信息可以去看下help信息 之后在打开的java文件界面右键

java rmi stub 反编译以后, 动态代理

源文件: /** * * User: xingxiaobing * Date: 2015-02-13 * 远程的接口的实现 */ public class HelloImpl extends UnicastRemoteObject implements IHello { /** * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 * * @throws RemoteExce

Eclipse4.4 安装java反编译插件Eclipse Class Decompiler

一.在线安装方式: Eclipse Class Decompiler整合了目前最好的2个Java反编译工具Jad和JD-Core,并且和Eclipse Class Viewer无缝集成,能够很方便的使用本插件查看类库源码,以及采用本插件进行Debug调试.Eclipse Class Decompiler插件更新站点: http://feeling.sourceforge.net/update,然后直接使用Eclipse进行更新,支持Eclipse 3.x, 4.x,不依赖任何其他插件,直接勾选更

Java反编译利器-Jad, Jode, Java Decompiler等及其IDE插件

转自:http://blog.csdn.net/superbeck/article/details/5189231 对于长年使用Java的程序员,大部分应该都会或多或少的使用到反编译软件.毕竟,不可能你所使用到的每一个包都会提供完善的javadoc,而且,有时候代码比javadoc更容易理解.这里将讲述笔者所了解的一些反编译软件以及它们各自的IDE插件版. 简介 现在业内的反编译软件据说有几十种.其中有jad,以及基于jad而开发的其他反编译软件(Front End Plus.mDeJava.D

Eclipse下的Java反编译插件 查看源代码不再困难

Eclipse下的Java反编译插件:Eclipse Class Decompiler,整合了目前最好的2个Java反编译工具Jad和JD-Core,并且和Eclipse Class Viewer无缝集成,能够很方便的使用本插件查看类库源码,以及采用本插件进行Debug调试. 转载自:http://bbs.csdn.net/topics/390263414 Eclipse Class Decompiler插件: http://download.csdn.net/detail/ibm_hoojo/

7 款开源 Java 反编译工具

今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在虚拟机上的编程语言,更容易进行反编译得到源代码.当然,也有一些商业软件,对其程序进行了混淆加密,这样我们就很难用工具反编译了. 1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到e

如何保护java程序不被反编译

Java是一种 跨平台的.解释型语言 Java 源代码编译中间“字节码”存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名.方法名 等.因此,Java中间代码的反编译就变得非常容易.目前市场上有许多免费的.商用的反编译软件,都能够生成高质量的反编译后的源代码.所以,对开发人员 来说,如何保护Java程序就变成了一个非常重要的挑战.下面我们就结合实例讨论 保护Java程序的基本方法然后对代码混淆问题进行深入研究,最后结合一个实际的应用程序

7款开源Java反编译工具

今天我们要来分享一些关于 Java 的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像 .NET.Java 这样的运行在虚拟机上的编程语言,更容易进行反编译得到源代码.当然,也有一些商业软件,对其程序进行了混淆加密,这样我们就很难用工具反编译了. 1.Java 反编译插件 -- Jadclipse JadClipse 是 Jad 的 Eclipse 插件,是一款非常实用而且方便地 Java 反编译插件,我们只