javap简介
原稿因特网址 http://www.javaresearch.org/article/768.htm .
可能我们很少会运用到javap工具,由于现下有很多好的反编译工具,但是我在此引见这个工具不是施用它进展反编译,而是查看java编译器为我们生成的字节码,透过比较字节码和源代码,我们可以发现很多的问题,一个很主要的功用就是理解很多编译器内部的工作机制,在著者早先的几篇稿子中乃是凭借此工具的,本站有这些稿件的原稿《深入辨析java种的结构模式》和《应用String仍是StringBuffer》。
下边我们经过具体的一个例证来容易的讲讲这个工具的功用,你不需要很深入的应用,这个简略的引见和容易的运用就可以使你受益非浅。
源代码:
Java代码
一.Java代码
2.
3. class StringTest
4.{
5. public static void main(String[] args)
6. {
7. String result="";
8. result+="ok";
9. }
10.}
Java代码
class StringTest
{
public static void main(String[] args)
{
String result="";
result+="ok";
}
}
在反编译前你当然亟需先编译这个种了:javac -g StringTest.java(施用-g参数是由于要失去底下javap -l时的输出急需施用此选项)
编译完成后,我们在应用不同的选项见见不同的成效:
一、先见见最简略的不带参数的状况:javap StringTest:
Java代码
一.Java代码
二.Compiled from StringTest.java
三.class StringTest extends java.lang.Object {
4. StringTest();
5. public static void main(java.lang.String[]);
6.}
Java代码
Compiled from StringTest.java
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}
不带参数的景况将应诺种的public信息,包括成员和步骤
从上头的输出中我们确定了两个学识:如其类没展示的从其它类衍生那么它便是从Object衍生;如其没为类展示的申明结构步骤,那么编译器将为之生成一个缺省结构步骤(不带参数的结构步骤)
二、javap -c StringTest:
输出 写道
Java代码
一.Compiled from StringTest.java
二.class StringTest extends java.lang.Object {
三.StringTest();
四.public static void main(java.lang.String[]);
5.}
6.
七.Method StringTest()
8. 零 aload_零
9. 一 invokespecial #一
10. 四 return
11.
12.Method void main(java.lang.String[])
13. 零 ldc #二
14. 二 astore_一
15. 三 new #三
16. 六 dup
17. 七 invokespecial #四
18. 十 aload_一
19. 11 invokevirtual #五
20. 14 ldc #六
21. 16 invokevirtual #五
22. 19 invokevirtual #七
23. 22 astore_一
24. 23 return
Compiled from StringTest.java
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}
Method StringTest()
零 aload_零
一 invokespecial #一
四 return
Method void main(java.lang.String[])
零 ldc #二
二 astore_一
三 new #三
六 dup
七 invokespecial #四
十 aload_一
11 invokevirtual #五
14 ldc #六
16 invokevirtual #五
19 invokevirtual #七
22 astore_一
23 return
带-p参数将额外的打印字节码信息
前方的和不带参数的输出同样,后边的展示了步骤的具体的字节码,从这个输出里边我们又可以理解更多的内容,首先是编译器生成的的缺省结构步骤的内容为调用父类的结构步骤super()(急需说明的是运用DJ反编译的源代码中这个缺省结构步骤没这个调用,这可能是该反编译器的一种优化),main()步骤的字节码信息的内容可以参照《运用String仍是StringBuffer》一文的叙述。
三、javap -l StringTest :
输出 写道
Java代码
一.Compiled from StringTest.java
二.class StringTest extends java.lang.Object {
三.StringTest();
四.public static void main(java.lang.String[]);
5.}
6.
七.Line numbers for method StringTest()
八.line 一: 零
9.
十.Local variables for method StringTest()
11.StringTest this pc=零, length=五, slot=零
12.
13.Line numbers for method void main(java.lang.String[])
14.line 五: 零
15.line 六: 三
16.line 七: 23
17.
18.Local variables for method void main(java.lang.String[])
19.java.lang.String[] args pc=零, length=24, slot=零
20.java.lang.String result pc=三, length=20, slot=一
Compiled from StringTest.java
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}
Line numbers for method StringTest()
line 一: 零
Local variables for method StringTest()
StringTest this pc=零, length=五, slot=零
Line numbers for method void main(java.lang.String[])
line 五: 零
line 六: 三
line 七: 23
Local variables for method void main(java.lang.String[])
java.lang.String[] args pc=零, length=24, slot=零
java.lang.String result pc=三, length=20, slot=一
-l参数将展示行号平局部变量表
从上头的输出中我们可以失去步骤中的变量和步骤的源代码至于字节码信息的,比如对应main()步骤,它的变量为输入参数args以及局部变量 result,步骤的源代码的第5行对应字节码的第0个偏移量,第5行对应字节码的第3个偏移量,而第7行对应字节码的第23偏移量(参见 javap -c的输出前方的偏移量),第7行现实是没话语的,但是有一个暗含的return,而偏移量23现实对应的也是return调用
四、javap -p StringTest:
输出 写道
Java代码
一.Compiled from StringTest.java
二.class StringTest extends java.lang.Object {
三.StringTest();
四.public static void main(java.lang.String[]);
5.}
Compiled from StringTest.java
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}
-p参数将额外的打印private成员和步骤的信息,由于这个类没因而输出雷同
这几个参数差一点就可以组成javap的最常施用的聚合,最惯用的应当仍是-c选项,由于可以打印字节码的信息,对于这些字节码的详细涵义在Java 杜撰机轨范中定义,感兴趣的可以查相面关的信息
本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception
- 1409 - PLS-00103: 出现符号 'CUR_EXTRACT '在需要下列之一时
- 1410 - error code 3:the system cannot find the path specified
- 1411 - Connection refused
- 1412 - ORA-00600: 内部错误代码
- 1413 - 安装所需的cab文件‘date1.cab’已损坏
- 1414 - RasSetEntryProperties函数返回632错误
- 1415 - System.Runtime.InteropServices.COMException (0x80004005): 无法创建目录或文件
- 1416 - System.Exception: 加载报表失败
- 1417 - CrystalDecisions.CrystalReports.Engine.ParameterFieldCurrentValueException: 缺少参数值
- 1418 - 导出 DLL:检测到错误
- 1419 - System.InvalidOperationException:修改集合;枚举操作可能无法执行
- 1420 - C# 交错数组
- 1421 - System.Web.Serivces.Protocols.SoapException服务器无法处理请求
- 1422 - webservice在VPN网络下通信异常
- 1423 - System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive
- 1424 - 数据传给子报表出错
- 1425 - An error has occurred during report processing
- 1426 - CListCtrl控件右键弹出菜单响应函数在运行时出错
- 1427 - BSCMAKE: error BK1506 : : No such file or directory
- 1428 - fatal error LNK1215: 元数据操作失败(8013110E)
- 1429 - .net安装错误