当前位置: 首页 >Java技术 > java代码反编译

java代码反编译

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。

大家也可以自己去http://jd.benow.ca/官网下载对应操作系统的jd-gui工具

一般情况下,很少有人使用javap对class文件进行反编译,因为有很多成熟的反编译工具可以使用,比如jad。但是,javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。

实例

javap命令分解一个class文件,它根据options来决定到底输出什么。如果没有使用options,那么javap将会输出包,类里的protected和public域以及类里的所有方法。javap将会把它们输出在标准输出上。来看这个例子

C:\Users\Clarence>javap -c C:\Users\Clarence\Desktop\JavaPractice\SerializeDemo\bin\com\gouguocompany\serializedemo\SerializeDemo.classCompiled from "SerializeDemo.java"public class com.gouguocompany.serializedemo.SerializeDemo {  public com.gouguocompany.serializedemo.SerializeDemo();Code:0: aload_01: invokespecial #8  // Method java/lang/Object."<init>":()V4: retu  public static void main(java.lang.String[]);Code:0: new#16 // class com/gouguocompany/serializedemo/Employee3: dup4: invokespecial #18 // Method com/gouguocompany/serializedemo/Employee."<init>":()V7: astore_18: aload_19: ldc#19 // String Clarence  11: putfield  #21 // Field com/gouguocompany/serializedemo/Employee.name:Ljava/lang/String;  14: aload_1  15: ldc#25 // String San Francisco  17: putfield  #27 // Field com/gouguocompany/serializedemo/Employee.address:Ljava/lang/String;  20: aload_1  21: ldc#30 // int 11122333  23: putfield  #31 // Field com/gouguocompany/serializedemo/Employee.SSN:I  26: aload_1  27: bipush101  29: putfield  #35 // Field com/gouguocompany/serializedemo/Employee.number:I  32: ldc#38 // String hello world  34: putstatic #40 // Field com/gouguocompany/serializedemo/Employee.test:Ljava/lang/String;  37: new#43 // class java/io/FileOutputStream  40: dup  41: ldc#45 // String /temp/employee.ser  43: invokespecial #47 // Method java/io/FileOutputStream."<init>":(Ljava/lang/String;)V  46: astore_2  47: new#50 // class java/io/ObjectOutputStream  50: dup  51: aload_2  52: invokespecial #52 // Method java/io/ObjectOutputStream."<init>":(Ljava/io/OutputStream;)V  55: astore_3  56: aload_3  57: aload_1  58: invokevirtual #55 // Method java/io/ObjectOutputStream.writeObject:(Ljava/lang/Object;)V  61: aload_3  62: invokevirtual #59 // Method java/io/ObjectOutputStream.close:()V  65: aload_2  66: invokevirtual #62 // Method java/io/FileOutputStream.close:()V  69: getstatic #63 // Field java/lang/System.out:Ljava/io/PrintStream;  72: ldc#69 // String Serialized data is saved in /tmp/employee.ser  74: invokevirtual #71 // Method java/io/PrintStream.println:(Ljava/lang/String;)V  77: goto  85  80: astore_2  81: aload_2  82: invokevirtual #76 // Method java/lang/Exception.printStackTrace:()V  85: retuException table:fromto  target type  377780Class java/lang/Exception

上面输出的内容就是字节码。

用法摘要

C:\Users\Clarence>Javap -help用法: javap <options> <classes>其中, 可能的选项包括:  -help  --help  -?输出此用法消息  -version 版本信息  -v  -verbose 输出附加信息  -l输出行号和本地变量表  -public  仅显示公共类和成员  -protected显示受保护的/公共类和成员  -package 显示程序包/受保护的/公共类和成员 (默认)  -p  -private 显示所有类和成员  -c对代码进行反汇编  -s输出内部类型签名  -sysinfo 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)  -constants显示最终常量  -classpath <path>指定查找用户类文件的位置  -cp <path>指定查找用户类文件的位置  -bootclasspath <path>覆盖引导类文件的位置

总结

javap可以用于反编译和查看编译器编译后的字节码。平时一般用javap -c比较多,该命令用于列出每个方法所执行的JVM指令,并显示每个方法的字节码的实际作用。可以通过字节码和源代码的对比,深入分析java的编译原理,了解和解决各种Java原理级别的问题。

作者:youaresherlock
来源链接:https://blog.csdn.net/qq_32252957/article/details/82876554

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/java/112306.html

分享给朋友:

“java代码反编译” 的相关文章