From:http://hi.baidu.com/tianhuimin/blog/item/3fcb61d019e57b9fa1ec9c80.html
javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具。
javap - Java class文件分解器
分解class文件
摘要:
javap [ options ] class. . .
描述:
javap命令分解一个class文件,它根据options来决定到底输出什么。如果没有使用options,那么javap将会输出包,类里的
protected和public域以及类里的所有方法。javap将会把它们输出在标准输出上。来看这个例子,先编译下面这个类。
Java代码
1.import java.awt.*;
2. import java.applet.*;
3.
4. public class Uenucom extends Applet {
5. String date;
6. String email;
7.
8. public void init() {
9. resize(500,100);
10. date = getParameter("LAST_UPDATED");
11. email = getParameter("EMAIL");
12. }
13.
14. public void paint(Graphics g) {
15. g.drawString(date + " by ",100, 15);
16. g.drawString(email,290,15);
17. }
18. }
import java.awt.*;
import java.applet.*;
public class Uenucom extends Applet {
String date;
String email;
public void init() {
resize(500,100);
date = getParameter("LAST_UPDATED");
email = getParameter("EMAIL");
}
public void paint(Graphics g) {
g.drawString(date + " by ",100, 15);
g.drawString(email,290,15);
}
}
在命令行上键入javap Uenucom后,输出结果如下
Java代码
1.Compiled from Uenucom.java
2.public class Uenucom extends java.applet.Applet {
3. java.lang.String date;
4. java.lang.String email;
5. public Uenucom();
6. public void init();
7. public void paint(java.awt.Graphics);
8.}
Compiled from Uenucom.java
public class Uenucom extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public Uenucom();
public void init();
public void paint(java.awt.Graphics);
}
如果加入了-c,即javap -c Uenucom,那么输出结果如下
Java代码
1. Compiled from Uenucom.java
2.public class Uenucom extends java.applet.Applet {
3. java.lang.String date;
4. java.lang.String email;
5. public Uenucom();
6. public void init();
7. public void paint(java.awt.Graphics);
8.}
9.
10.Method Uenucom()
11. 0 aload_0
12. 1 invokespecial #1
13. 4 return
14.
15.Method void init()
16. 0 aload_0
17. 1 sipush 500
18. 4 bipush 100
19. 6 invokevirtual #2
20. 9 aload_0
21. 10 aload_0
22. 11 ldc #3
23. 13 invokevirtual #4
24. 16 putfield #5
25. 19 aload_0
26. 20 aload_0
27. 21 ldc #6
28. 23 invokevirtual #4
29. 26 putfield #7
30. 29 return
31.
32.Method void paint(java.awt.Graphics)
33. 0 aload_1
34. 1 new #8
35. 4 dup
36. 5 invokespecial #9
37. 8 aload_0
38. 9 getfield #5
39. 12 invokevirtual #10
40. 15 ldc #11
41. 17 invokevirtual #10
42. 20 invokevirtual #12
43. 23 bipush 100
44. 25 bipush 15
45. 27 invokevirtual #13
46. 30 aload_1
47. 31 aload_0
48. 32 getfield #7
49. 35 sipush 290
50. 38 bipush 15
51. 40 invokevirtual #13
52. 43 return
53.
Compiled from Uenucom.java
public class Uenucom extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public Uenucom();
public void init();
public void paint(java.awt.Graphics);
}
Method Uenucom()
0 aload_0
1 invokespecial #1
4 return
Method void init()
0 aload_0
1 sipush 500
4 bipush 100
6 invokevirtual #2
9 aload_0
10 aload_0
11 ldc #3
13 invokevirtual #4
16 putfield #5
19 aload_0
20 aload_0
21 ldc #6
23 invokevirtual #4
26 putfield #7
29 return
Method void paint(java.awt.Graphics)
0 aload_1
1 new #8
4 dup
5 invokespecial #9
8 aload_0
9 getfield #5
12 invokevirtual #10
15 ldc #11
17 invokevirtual #10
20 invokevirtual #12
23 bipush 100
25 bipush 15
27 invokevirtual #13
30 aload_1
31 aload_0
32 getfield #7
35 sipush 290
38 bipush 15
40 invokevirtual #13
43 return
当然,如果想分析这个文件,可以讲输出结果输出到一个文件里。可以这样写
javap -c Uenucom > F://test.txt
这样就会输出到F盘的test.txt文件中了。
选项:
-help 不说了
-l 输出行和变量的表
-public 只输出public方法和域
-protected 只输出public和protected类和成员
-package 只输出包,public和protected类和成员,这是默认的
-private 输出所有类和成员
-s 输出内部类型签名
-c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,
-verbose 输出栈大小,方法参数的个数
。。。
======================================================================
摘要: javap是一个很好的深入查看程序内部运行机制的工具,不过它有不同于汇编的自有格式的语句。本文
通过用javap对
i=i++ + ++i
这一特殊语言现象进行分析,带你进入javap的微观世界。============================================
================================================
首先我们来了解一下javap命令及其基本用法。
javap是sun提供的对class文件进行反编译的工具,javap和javac、java等bin文件存放路径相同,当你配置好了环
境变量后,javap就和javac、java等命令的用法类似了。
javap最基本的用法,也是最常用的用法如下:
javap -[参数] test
其中,test是test.java文件经javac编译后产生的class文件名,也就是说,在javap之前,你必须用javac编译这
个文件,需要注意的一点是,在使用javap反编译.class文件时,不要带上其后缀名,否则会报错。
我们对javap最常用的参数是c,也就是形如 javap -c test 的用法,如果你还想对javap的参数进一步了解的话,
我向你推荐 www.javaresearch.org 的一篇文章《javap简介》,你可以在该网站的首页上通过查询该标题得到这
篇文章。下面我们进入正题:
•第一例
int i = 0;
i=i++ + ++i;
Code:
0: iconst_0 将 0 推到堆栈中//对应赋值语句 int i = 0;iconst_0中的0为初始值
1: istore_1 从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处 //对应赋值语句,上句是
赋值,这句是存储,索引1处即为i,因为没有其它变量,所以本例中局部变量的索引不变
2: iload_1 将局部变量表索引 1 处的值推到堆栈中//将局部变量索引1处的计算结果推入堆栈临时
存储,局部变量的索引从1开始,依此类推,这句意味着将变量i=0先推入堆栈临时存储
3: iinc 1, 1 局部变量表索引 1 处的变量加 1 //将变量i自加1,则此时变量i为1
6: iinc 1, 1 局部变量表索引 1 处的变量加 1 //再将变量i自加1,则此时变量i为2
9: iload_1 将局部变量表索引 1 处的值推到堆栈中//将变量i=2推入堆栈临时存储
10: iadd 从操作数堆栈中弹出两个整数并让它们相加。将得到的整数推回堆栈中//将两次暂存的
整数相加,即0+2=2
11: istore_1 从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处//把上步相加之结果弹出
堆栈
12: return 从堆栈中弹出值并将它推到调用方法的操作数栈中。退出方法//将i=2返回,计算结束
•第二例
int i=0;
i = ++i + i++;
Code:
0: iconst_0 将 0 推到堆栈中//对应赋值语句 int i = 0;iconst_0中的0为初始值
1: istore_1 从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处 //对应赋值语句,上句
是赋值,这句是存储
2: iinc 1, 1 局部变量表索引 1 处的变量加 1 //将变量i自加1,则此时变量i为1
5: iload_1 将局部变量表索引 1 处的值推到堆栈中//将变量i=1推入堆栈临时存储
6: iload_1 将局部变量表索引 1 处的值推到堆栈中//将变量i=1推入堆栈临时存储
7: iinc 1, 1 局部变量表索引 1 处的变量加 1 //再将变量i自加1,则此时变量i为2
10: iadd 从操作数堆栈中弹出两个整数并让它们相加。将得到的整数推回堆栈中//将两次暂存的
整数相加,即0+2=2 注意:虽然上步让i=2,但是并没有推入堆栈作存储
11: istore_1 从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处//把上步相加之结果弹出堆栈
12: return 从堆栈中弹出值并将它推到调用方法的操作数栈中。退出方法//将i=2返回,计算结束
======================================================================================
下面给出的是较为复杂一点的例子,供读者自行分析。
int i=0;
i= i++ + ++i;
int j=0;
j= ++j + ++j;
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iinc 1, 1
6: iinc 1, 1
9: iload_1
10: iadd
11: istore_1
12: iconst_0
13: istore_2
14: iinc 2, 1
17: iload_2
18: iinc 2, 1
21: iload_2
22: iadd
23: istore_2
24: return
参考资料
http://blog.csdn.net/myyate/archive/2007/07/24/1704852.aspx
http://www.javaeye.com/topic/466832
http://www.examda.com/JAVA/Instructs/050924/095749165.html
http://www.examda.com/linux/fudao/20070604/085826447.html
发表评论
-
CLoader
2013-03-27 15:41 0Tomcat的class加载的优先顺序一览 1.最先是$JA ... -
solr
2013-01-11 16:03 0From : http://www.cnblogs.com/t ... -
Spring Load Time Weaving
2013-01-09 13:52 0From : http://sexycoding.itey ... -
log4j
2012-10-24 10:18 0From : http://kdboy.iteye.com/b ... -
java.conrurrent.lock
2011-12-13 13:21 621123 -
struts2 table
2011-11-24 10:13 815<constant name="struts. ... -
jvm classloader
2011-11-16 17:06 602From http://www.ibm.com/develo ... -
socket send receive
2011-11-16 16:58 1275client public void createCon ... -
xml converter
2011-11-16 16:52 704public class XmlUtil { /** ...
相关推荐
使用c/c++实现javap的功能,加深对java中class结构的理解
一个类似于javap的java反编译工具,运行速度快,据说Front End Plus、mDeJava、Decafe Pro、Cavaj Java Decomplier、DJ Java Compiler、NMI's Java Class Viewer等反汇编工具都以jad作为核心引擎,只是在jad内核的...
Java Development Kit is the official development kit for the ...which displays process information for current Java processes, javap - the class file disassembler, and other components are also included.
简单的借助jdk中的内置工具帮助我们对比Java源码和生成的字节码以及探究Class文件字节码结构 使用方法 编写Java源码,如项目目录中的Main.java: 运行javac编译成字节码 javac -g:vars Main.java 编译生成...
NULL 博文链接:https://bolinyang.iteye.com/blog/1830472
安装$ npm install java-class-parser --save [-g]用法在命令行中: $ jjs-parser ./Model.class Service.class 在节点: var parser = require ( 'java-class-parser' ) ;var clazzes = [ './Config.class' ] ;...
jad.exe-windows版本,将.class文件反编译为java文件(专业) 使用 java自带的javap -p 名称.class反编译的有可能不正确,例如反编译Enum枚举,所以我们需要使用更加专业的工具
打开Java .class文件时 当提取罐子内的.class文件时 无论如何,必须在系统中安装javap才能使此扩展生效,因为该工具实际上是执行反汇编的工具。 安装 您可以使用Emacs中的package.el内置软件包管理器来安装此软件包...
class识别jdk版本 jdk版本 class识别jdk版本 jdk版本
这是一个快速查看插件,可让您将Java .class文件预览为字节码。 它使用javap -c命令。 要求 苹果系统 已安装Java 安装 编译目标并将二进制文件复制到/Library/QuickLook或~/Library/QuickLook 。
然后,运行javap -verbose -c compiled_file.class > decompiled_file.txt created_file.class javap -verbose -c compiled_file.class > decompiled_file.txt来反编译.class文件。 此时,进入byte
javap -c xxx.class > xxx.txt 反汇编 方便大家查阅理解JVM执行代码的过程
它与jdk中的javap命令有点类似,但显示了更多有组织的细节。 安装 从下面的zip下载并解压缩代码/类文件。 用法 代码 将类目录yourDirectory/jorex/programs/reflector/到您的类路径中,用将zip文件解压缩到的目录...
classpy, 用于研究Java类文件的GUI工具 ClasspyClasspy是一个用于研究Java类文件的GUI工具。的灵感这里工具主要由 javap 和 JavaClassViewer激发。 我重新发明了轮子,原因如下:1. Learn Java class file
java – 运行编译后的java程序(.class后缀的) appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 Javap:...
使用Java编程语言,对.class文件进行解析,类似于javap -v filename指令的效果,但是没有对attibutes属性进行解析,需要学习的可以下载,程序运行的效果在本人的博客的附录中
Java文件想要看字节码通常使用 javap 命令将java的class文件反汇编,具体操作步骤如下: 1. 先写好一个SynchronizedTest.java文件(下面贴出) 2. 在java文件的目录下,使用命令 javac SynchronizedTest.java 编译,...
Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 继承、封装、多态的实现原理 容器...
Tool APIs java javac javadoc jar javap JPDA JConsole Java VisualVM Java DB Security Int'l RMI IDL Deploy Monitoring Troubleshoot Scripting JVM TI JRE RIAs Java Web Start Applet / Java Plug-in ...
java反编译工具: JD-GUI JD-GUI 是一个用 C++ 开发的 Java 反编译工具... (它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。)