Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

javap(反汇编命令)详解

来源: hudashi 分享至:
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查看编译版本

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史