[size=medium]javap 是jdk 自带的一个工具,可以反编译,也可以
查看java编辑器生成的字符码,是分析代码的一个好的工具。
要分解class文件,方法:javap [option] class(没有后缀)
option:
-help 帮助;
-l 输出行和变量的表,在这个步骤之前需要运行命令 javac -g class.java,得到javap -l calss 所需要的参数;详见javac-public 只输出public方法和域;
-protected 只输出public和protected类和成员;
-package 只输出包,public 和protected 类和成员,这是默认的;
-private 输出所有类和成员;
-s 输出内部类型签名;
-c 输出分解后的代码,例如,类中每一个方法内,包含java字符码的指令;
-verbose 输出栈大小,方法参数的个数;
例1:
public class JavapCTest{
/**
* @param args
*/
public static void main(String[] args){
int i = 2;
int j = 3;
}
}
执行javac.JavapCTest.java,配置好自己的环境,再执行javap -c JavapCTest,得到如下代码:
Code:
[color=violet] 0: iconst_2 //把2放到栈顶
1: istore_1 //把栈顶的值放到局部变量1中,即i中
2: iconst_3 //把3放到栈顶
3: istore_2 //把栈顶的值放到局部变量2中,即j中
4: return[/color]
对于int i = 2;首先它会在栈中创建一个变量为i的引用,然后查找有没有字面值为2的地址,没找到,就开辟一个存放2这么字面值的地址,然后将i指向2的地址。
例2:
public class Difficult {
public static void main(String[] args)
{
int i=2;
i=i++;
int j=i++;
System.out.println(i+":"+j);
}
}
输出结果:
3:2
Code:
[color=violet]0: iconst_2 //将常数2压入栈中:2
1: istore_1 //将栈顶的元素pop出,存入局部变量索引为1的位置:(栈中元素为空)
2: iload_1 //将局部变量索引为1的int压入栈:2
3: iinc 1, 1 //将局部变量索引为1的值加1:2
6: istore_1 //pop栈顶元素,将其存储到局部变量索引为1的位置:(栈中元素为空)
7: iload_1 //将局部变量索引为1的int压入栈:2
8: iinc 1, 1 //将局部变量索引为1的值加1:2
11: istore_2 //pop栈顶元素,将其存入局部变量索引为2的位置:(栈中元素为空)
12: return //返回:(栈中元素为空)[/color]
例3:
public class ByteCodeDemo {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
运行完javap命令,你会看到如下输出:
public class ByteCodeDemo extends java.lang.Object {
public ByteCodeDemo();
public static void main(java.lang.String[]);
}
Method ByteCodeDemo()
0 aload_0
1 invokespecial #1 <Method java.lang.Object()>
4 return
Method void main(java.lang.String[])
0 getstatic #2 <Field java.io.PrintStream out>
3 ldc #3 <String "Hello world">
5 invokevirtual #4 <Method void println(java.lang.String)>
8 return
在这短小的列表中你可以学到很多字节码知识,从main方法第一个指令开始
0 getstatic #2 ,开始的整数是方法中的指令的偏移值,因此第一个指令以0开始。紧随偏移量是指令的助记符(mnemonic)。在这个范例中,
'getstatic' 指令将一个静态成员压入一个称为操作数堆栈的数据结构,后续的指令可以引用这个数据结构中的成员。getstatic 指令后是要压入的成员。在这个例子中,要压入的成员是"#2 " 。如果你直接检查字节码,你会看到成员信息没有直接嵌入指令而是像所有由java类使用的常量那样存储在一个共享池中。将成员信息存储在一个常量池中可以减小字节码指令的大小,因为指令只需要存储常量池中的一个索引而不是整个常量。在这个例子中,成员信息位于常量池中的#2处。常量池中的项目的顺序是和编译器相关的,因此在你的环境中看到的可能不是'#2' 。
分析完第一个指令后很容易猜到其它指令的意思。
'ldc' (load constant) 指令将常量"Hello, World."压入操作数栈。'invokevirtual'指令调用println方法,它从操作数栈弹出它的两个参数。不要忘记一个像println 这样的实例方法有两个参数:上面的字符串,加上隐含的'this'引用。
[/size]
分享到:
相关推荐
NULL 博文链接:https://bolinyang.iteye.com/blog/1830472
java 聊天
Java提供了javap工具来反汇编和检查Java字节码。 这使作者可以查看其代码如何在较低级别上运行,了解如何对高级Scala概念进行编码以及潜在地发现性能问题。 使用javap一个挑战是正确指定类路径。 由于SBT知道您项目...
Javajavap工具的实现javap打印出传递给它的类的包,受保护的字段以及公共字段和方法。
java反编译工具: JD-GUI JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台 Javap 问:javap是反编译,还是反汇编? 答:javap是JDK自带的反汇编器...
NULL 博文链接:https://josephmok.iteye.com/blog/813774
jar包反编译工具jd-gui和eclipe反编译工具和插件.可用
Java实现的聊天程序。支持客户端与客户端的通信。适合初学者学习研究。。。。。。
NULL 博文链接:https://shansun123.iteye.com/blog/658120
介绍常用的JVM诊断和分析工具,并以死锁和OOM为例,展示这些工具的使用。 第八课 分析Java堆 MAT的使用案例 Jvisualvm介绍使用 介绍了Java堆的分析方法,以一个实例为基础,展示对堆的分析过程。 第九课 锁 ...
classpy, 用于研究Java类文件的GUI工具 ClasspyClasspy是一个用于研究Java类文件的GUI工具。的灵感这里工具主要由 javap 和 JavaClassViewer激发。 我重新发明了轮子,原因如下:1. Learn Java class file
一个类似于javap的java反编译工具,运行速度快,据说Front End Plus、mDeJava、Decafe Pro、Cavaj Java Decomplier、DJ Java Compiler、NMI's Java Class Viewer等反汇编工具都以jad作为核心引擎,只是在jad内核的...
jdk全称“Java Development Kit”,指的是Java语言的软件开发工具包,主要用于移动设备...Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 Jconsole: Java进行系统调试和监控的工具
NULL 博文链接:https://glamey.iteye.com/blog/987463
自己备用 jdb jdeps jhat appletviewer jar javac javadoc javah javap
在遇到一些小问题的时候我们经常会使用Javap反编译取得字节码来分析,虽然Javap能完成这个工作,但是有两个缺点,一方面操作麻烦,需要很多步骤,一方面没有文档注释,对新手来说看起字节码来比较麻烦。这里推荐一个...
JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码 jar – 打包工具,将...Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 Jconsole: Java进行系统调试和监控的工具
JDK的全称(java Development Kit java开发工具包) JDK=JRE+java的开发工具(java,javac,javadoc,javap等) JDK给java开发人员使用包含JRE,所以不用单独安装 JRE JRE(java Runtime environment java运行环境)...
jdk1.6安装教程及环境变量配置: 双击运行"jdk-6u45-windows-x64.exe"程序,依...Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 Jconsole: Java进行系统调试和监控的工具结构图
在遇到一些小问题的时候我们经常会使用Javap反编译取得字节码来分析,虽然Javap能完成这个工作,但是有两个缺点,一方面操作麻烦,需要很多步骤,一方面没有文档注释,对新手来说看起字节码来比较麻烦。 这里推荐...