javap(反编译)

参数简介:

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

应用实例:

a = a ++;会怎么样?
代码:

public class A {
    public static void main(String[] args) {
        int a = 1;
        a = a ++;
        System.out.printf(a+"");
    }
}

命令:

➜  classes javap -c A

结果:

Compiled from "A.java"
public class A {
  public A();
    Code:
       0: aload_0
       1: invokespecial #1 // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iload_1
       3: iinc          1, 1
       6: istore_1
       7: getstatic     #2 // Field java/lang/System.out:Ljava/io/PrintStream;
      10: new           #3 // class java/lang/StringBuilder
      13: dup
      14: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
      17: iload_1
      18: invokevirtual #5 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      21: ldc           #6 // String
      23: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      26: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      29: iconst_0
      30: anewarray     #9 // class java/lang/Object
      33: invokevirtual #10 // Method java/io/PrintStream.printf:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
      36: pop
      37: return
}

重点是:

2: iload_1 //把第一个临时变量取出来放在栈顶
3: iinc 1, 1 //自增第一个临时变量
6: istore_1 //把栈顶的数据存回第一个临时变量

so , 明白了

你可以试着反汇编出a = ++ a。

你可能感兴趣的:(java,jdk,Class,反编译)