java

位置:IT落伍者 >> java >> 浏览文章

javap(反汇编命令)详解


发布日期:2024年05月02日
 
javap(反汇编命令)详解

javap是JDK自带的反汇编器可以查看java编译器为我们生成的字节码通过它我们可以对照源代码和字节码从而了解很多编译器内部的工作

语法

javap [ 命令选项 ] class

javap 命令用于解析类文件其输出取决于所用的选项若没有使用选项javap 将输出传递给它的类的 public 域及方法javap 将其输出到标准输出设备上

命令选项

help 输出 javap 的帮助信息

l 输出行及局部变量表

b 确保与 JDK 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

tjar 和 jrelibinjar 中

extdirs[dirs] 覆盖搜索安装方式扩展的位置扩展的缺省位置是 jrelibext

实例

Hellojava文件

public class Hello

{

static void main(String args[])

{

int i=;

int j=;

int m=i+j;

Systemoutprintln(m:+m);

}

int get()

{

int a=;

int b=;

int c=;

int d=;

int e=;

int f=;

int n=a+b+c+d+e+f;

return n;

}

static int get()

{

int a=;

int b=;

int c=;

int d=a+b;

return d;

}

}

然后再执行以下命令

javac Hellojava

javap c Hello

得到

Compiled from Hellojava

public class Hello extends javalangObject{

public Hello();

Code:

:

aload_

:

invokespecial #; //Method java/lang/Object<init>:()V

:

return

static void main(javalangString[]);

Code:

:

bipush

:

istore_

:

bipush

:

istore_

:

iload_

:

iload_

:

iadd

:

istore_

:

getstatic #; //Field java/lang/Systemout:Ljava/io/PrintStream;

:

new #; //class java/lang/StringBuilder

:

dup

:

invokespecial #; //Method java/lang/StringBuilder<init>:()V

:

ldc #; //String m:

:

invokevirtual #; //Method java/lang/StringBuilderappend:(Ljava/lang/String;)Ljava/lang/StringBuilder;

:

iload_

:

invokevirtual #; //Method java/lang/StringBuilderappend:(I)Ljava/lang/StringBuilder;

:

invokevirtual #; //Method java/lang/StringBuildertoString:()Ljava/lang/String;

:

invokevirtual #; //Method java/io/PrintStreamprintln:(Ljava/lang/String;)V

:

return

int get();

Code:

:

iconst_

:

istore_

:

iconst_

:

istore_

:

iconst_

:

istore_

:

iconst_

:

istore

:

iconst_

:

istore

:

bipush

:

istore

:

iload_

:

iload_

:

iadd

:

iload_

:

iadd

:

iload

:

iadd

:

iload

:

iadd

:

iload

:

iadd

:

istore

:

iload

:

ireturn

static int get();

Code:

:

iconst_

:

istore_

:

bipush

:

istore_

:

bipush

:

istore_

:

iload_

:

iload_

:

iadd

:

istore_

:

iload_

:

ireturn

}

               

上一篇:Java BigInteger开方sqrt的实现

下一篇:在Java Web中的入侵检测及实现