• javap(反汇编命令)详解


    javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
    语法:
      javap [ 命令选项 ] class. . .
      javap 命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap 将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。
    命令选项
      -help 输出 javap 的帮助信息。
      -l 输出行及局部变量表。
      -b 确保与 JDK 1.1 javap 的向后兼容性。
      -public 只显示 public 类及成员。
      -protected 只显示 protected 和 public 类及成员。
      -package 只显示包、protected 和 public 类及成员。这是缺省设置。
      -private 显示所有类和成员。
      -J[flag] 直接将 flag 传给运行时系统。
      -s 输出内部类型签名。
      -c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
      -verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
      -classpath[路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
       - bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jrelib
      t.jar 和 jrelibi18n.jar 中。
      -extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。
    实例1:
    Hello.java文件
    public class Hello
    {
    static void main(String args[])
    {
    int i=10;
    int j=100;
    int m=i+j;
    System.out.println("m:"+m);
    }
    int get()
    {
    int a=1;
    int b=2;
    int c=3;
    int d=4;
    int e=5;
    int f=6;
    int n=a+b+c+d+e+f;
    return n;
    }
    static int get2()
    {
    int a=1;
    int b=12;
    int c=39;
    int d=a+b;
    return d;
    }
    }
    然后再执行以下命令:
    javac Hello.java
    javap -c Hello
    得到
    Compiled from "Hello.java"
    public class Hello extends java.lang.Object{
    public Hello();
      Code:
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: return
     
    static void main(java.lang.String[]);
      Code:
       0: bipush 10
       2: istore_1
       3: bipush 100
       5: istore_2
       6: iload_1
       7: iload_2
       8: iadd
       9: istore_3
       10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       13: new #3; //class java/lang/StringBuilder
       16: dup
       17: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
       20: ldc #5; //String m:
       22: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       25: iload_3
       26: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
       29: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
       32: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       35: return
     
    int get();
      Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iconst_3
       5: istore_3
       6: iconst_4
       7: istore 4
       9: iconst_5
       10: istore 5
       12: bipush 6
       14: istore 6
       16: iload_1
       17: iload_2
       18: iadd
       19: iload_3
       20: iadd
       21: iload 4
       23: iadd
       24: iload 5
       26: iadd
       27: iload 6
       29: iadd
       30: istore 7
       32: iload 7
       34: ireturn
     
    static int get2();
      Code:
       0: iconst_1
       1: istore_0
       2: bipush 12
       4: istore_1
       5: bipush 39
       7: istore_2
       8: iload_0
       9: iload_1
       10: iadd
       11: istore_3
       12: iload_3
       13: ireturn
     
    }
    另外关于如何使用javap命令查看class文件的编译版本请参考《用javap查看编译版本
  • 相关阅读:
    R--相关分布函数、统计函数的使用
    Spark Streaming
    统计与分布的相关知识
    Python--WebDriverWait+expected_conditions的一个应用
    Python+Selenium与Chrome如何进行完美结合
    Python+Selenium+Chrome 的一个案例
    python -使用Requests库完成Post表单操作
    JetBrains PyCharm 2018.2.4 x64 工具里如何安装bs4
    用JetBrains PyCharm 开发工具写一个简单python案例
    dom4j学习总结(一)
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/6425003.html
Copyright © 2020-2023  润新知