当前位置: 主页 > JAVA语言

反编译java-java编译成功无法运行

发布时间:2023-02-09 14:41   浏览次数:次   作者:佚名

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

也可以去官网下载操作系统对应的jd-gui工具

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

例子

javap命令分解一个class文件,它根据选项决定输出什么。 如果不使用options,那么javap将输出类中的package、protected和public字段以及类中的所有方法。 javap 将在标准输出上输出它们。看看这个例子

C:\Users\Clarence>javap -c C:\Users\Clarence\Desktop\JavaPractice\SerializeDemo\bin\com\gouguocompany\serializedemo\SerializeDemo.class
Compiled from "SerializeDemo.java"
public class com.gouguocompany.serializedemo.SerializeDemo {
  public com.gouguocompany.serializedemo.SerializeDemo();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."":()V
       4: return
  public static void main(java.lang.String[]);

java编译需要标识符_java编译成功无法运行_反编译java

Code: 0: new #16 // class com/gouguocompany/serializedemo/Employee 3: dup 4: invokespecial #18 // Method com/gouguocompany/serializedemo/Employee."":()V 7: astore_1 8: aload_1 9: 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

反编译java_java编译成功无法运行_java编译需要标识符

26: aload_1 27: bipush 101 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."":(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."":(Ljava/io/OutputStream;)V

java编译需要标识符_java编译成功无法运行_反编译java

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

反编译java_java编译成功无法运行_java编译需要标识符

82: invokevirtual #76 // Method java/lang/Exception.printStackTrace:()V 85: return Exception table: from to target type 37 77 80 Class java/lang/Exception

上面的输出是字节码。

使用总结

C:\Users\Clarence>Javap -help
用法: javap  
其中, 可能的选项包括:
  -help  --help  -?        输出此用法消息
  -version                 版本信息
  -v  -verbose             输出附加信息
  -l                       输出行号和本地变量表

反编译java_java编译成功无法运行_java编译需要标识符

-public 仅显示公共类和成员 -protected 显示受保护的/公共类和成员 -package 显示程序包/受保护的/公共类 和成员 (默认) -p -private 显示所有类和成员 -c 对代码进行反汇编 -s 输出内部类型签名 -sysinfo 显示正在处理的类的 系统信息 (路径, 大小, 日期, MD5 散列) -constants 显示最终常量 -classpath 指定查找用户类文件的位置 -cp 指定查找用户类文件的位置 -bootclasspath 覆盖引导类文件的位置

总结

javap可以用来反编译查看编译器编译后的字节码。 一般都是用javap -c。 该命令用于列出每个方法执行的JVM指令,并显示每个方法的字节码的实际功能。 通过字节码和源码的对比,深入剖析java的编译原理,理解和解决java原理层面的各种问题。