关于class文件中的指令剖析

来源:互联网 发布:ipad软件连不上网络 编辑:程序博客网 时间:2024/05/18 13:25

在介绍class结构和指令之前先介绍一下java方法执行机制:java的方法都是运行在线程的栈中,一个线程拥有一个执行栈,一个执行栈包含多个栈帧,一个方法对应一个栈帧,一个栈帧包含一个局部变量区和一个操作数栈区,当一个方法要执行时先会创建一个方法栈帧当方法执行完之后线程销毁栈帧。

// class version 50.0 (50)
// access flags 1
public class com/test/bean/StudentPrxoy0 extends com/test/bean/Student  {

//下面是一些类型描述符的介绍

//boolean(Z),byte(B),short(S),int(I),float(F),double(D),long(J),char(C),String(Ljava/lang/String;)这些都是类型描述符

//boolean[]([Z),byte[]([B),short[]([S),int[]([I),float[]([F),double[]([D),long[]([J),char[]([C),String[]([Ljava/lang/String;)这些都是类型描述符
  // access flags 2
  private Lcom/test/bean/InvocationHandler; h//Lcom/test/bean/InvocationHandler; 是字段描述符,h是字段名称

  // access flags 9
  public static Ljava/lang/reflect/Method; method0// Ljava/lang/reflect/Method;是字段类型描述符,method0是字段名称

  // access flags 9
  public static Ljava/lang/reflect/Method; method1// Ljava/lang/reflect/Method;是字段类型描述符,method1是字段名称

  // access flags 9
  public static Ljava/lang/reflect/Method; method2// Ljava/lang/reflect/Method;是字段类型描述符,method2是字段名称

  // access flags 9
  public static Ljava/lang/reflect/Method; method3// Ljava/lang/reflect/Method;是字段类型描述符,method3是字段名称

  // access flags 9
  public static Ljava/lang/reflect/Method; method4// Ljava/lang/reflect/Method;是字段类型描述符,method4是字段名称

  // access flags 9
  public static Ljava/lang/reflect/Method; method5// Ljava/lang/reflect/Method;是字段类型描述符,method5是字段名称

  // access flags 1
  public <init>()V//在java源码中类名和构造函数名称一致但是class文件中就是<init>,静态块就是<clinit>,V是指示void返回类型
    ALOAD 0//读取this引用变量到操作数栈中iload读取int,byte,boolean,char类型的局部变量
    INVOKESPECIAL java/lang/Object.<init> ()V //INVOKESPECIAL 指令用来调用private的或者构造函数的方法
    RETURN //返回,ireturn是有返回值的并且返回int,byte,boolean,char类型的,如果是对象就是Areturn,其他依次类推
    MAXSTACK = 1//操作数栈的大小
    MAXLOCALS = 1//局部变量区域的大小

  // access flags 1
  public <init>(Lcom/test/bean/InvocationHandler;)V
    ALOAD 0//读取this引用
    INVOKESPECIAL java/lang/Object.<init> ()V//调用父类的无参数构造函数
    ALOAD 0//读取this引用
    ALOAD 1//读取构造函数中的局部变量
    PUTFIELD com/test/bean/StudentPrxoy0.h : Lcom/test/bean/InvocationHandler;//PUTFIELD owner(类) name(字段名称) desc(描述符)这句话等同于this.h=h;
    RETURN
    MAXSTACK = 2//操作数栈大小用于存放this引用和h变量
    MAXLOCALS = 2//两个局部变量

  // access flags 1
  public add(Ljava/lang/Object;Ljava/lang/String;SI)Ljava/lang/Object;
    ALOAD 0//加载this
    GETFIELD com/test/bean/StudentPrxoy0.h : Lcom/test/bean/InvocationHandler;//GETFIELD  owner(类) name(字段名称) desc(描述符)这句话等同于this.h
    ALOAD 0
    LDC "add" // LDC 用于加载任意类型的变量 "add"是方法参数
    ALOAD 0
    GETSTATIC com/test/bean/StudentPrxoy0.method0 : Ljava/lang/reflect/Method;//GETSTATIC 指令用于调用静态方法
    LDC 4//数组的长度
    MULTIANEWARRAY [Ljava/lang/Object; 1//MULTIANEWARRAY 指令是new一个多维数组1是指一维数组
    DUP//复制数组并置于操作数栈顶部
    LDC 0//数组下标
    ALOAD 1//第一个局部变量
    AASTORE//AASTORE赋值指令等同于param[0]=var;
    DUP//复制
    LDC 1//数组下标
    ALOAD 2//局部变量
    AASTORE//AASTORE赋值指令
    DUP//复制
    LDC 2//数组下标
    ILOAD 3//局部变量作为参数传递给Short.valueOf
    INVOKESTATIC java/lang/Short.valueOf (S)Ljava/lang/Short;//调用Short.valueOf
    AASTORE//AASTORE赋值指令
    DUP//复制
    LDC 3//数组下标
    ILOAD 4//局部变量
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;//调用Integer.valueOf
    AASTORE//赋值
    INVOKEINTERFACE com/test/bean/InvocationHandler.invoke (Ljava/lang/Object;Ljava/lang/String;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;//调用InvocationHandler.invoke 方法
    CHECKCAST java/lang/Object//CHECKCAST类型转换指令java/lang/Object是要转换成的类型
    ARETURN//返回一个一值
    MAXSTACK = 0
    MAXLOCALS = 5

  // access flags 8
  static <clinit>()V//下面的和上面的指令类似就不在细说
    TRYCATCHBLOCK L0 L1 L1 java/lang/Exception
   L0
    ALOAD 0
    LDC "com.test.bean.Student"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    LDC "add"
    LDC 4
    MULTIANEWARRAY [Ljava/lang/Class; 1
    DUP
    LDC 0
    LDC "java.lang.Object"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    DUP
    LDC 1
    LDC "java.lang.String"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    DUP
    LDC 2
    LDC "java/lang/Short"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    DUP
    LDC 3
    LDC "java/lang/Integer"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    INVOKEVIRTUAL java/lang/Class.getMethod (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    PUTSTATIC com/test/bean/StudentPrxoy0.method0 : Ljava/lang/reflect/Method;
    ALOAD 0
    LDC "com.test.bean.Student"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    LDC "update"
    LDC 3
    MULTIANEWARRAY [Ljava/lang/Class; 1
    DUP
    LDC 0
    LDC "java.lang.Object"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    DUP
    LDC 1
    LDC "java.lang.String"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    DUP
    LDC 2
    LDC "java/lang/Integer"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    INVOKEVIRTUAL java/lang/Class.getMethod (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    PUTSTATIC com/test/bean/StudentPrxoy0.method1 : Ljava/lang/reflect/Method;
    ALOAD 0
    LDC "com.test.bean.Student"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    LDC "del"
    LDC 2
    MULTIANEWARRAY [Ljava/lang/Class; 1
    DUP
    LDC 0
    LDC "java.lang.Object"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    DUP
    LDC 1
    LDC "java.lang.String"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    INVOKEVIRTUAL java/lang/Class.getMethod (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    PUTSTATIC com/test/bean/StudentPrxoy0.method2 : Ljava/lang/reflect/Method;
    ALOAD 0
    LDC "java.lang.Object"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    LDC "hashCode"
    LDC 0
    MULTIANEWARRAY [Ljava/lang/Class; 1
    INVOKEVIRTUAL java/lang/Class.getMethod (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    PUTSTATIC com/test/bean/StudentPrxoy0.method3 : Ljava/lang/reflect/Method;
    ALOAD 0
    LDC "java.lang.Object"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    LDC "equals"
    LDC 1
    MULTIANEWARRAY [Ljava/lang/Class; 1
    DUP
    LDC 0
    LDC "java.lang.Object"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    AASTORE
    INVOKEVIRTUAL java/lang/Class.getMethod (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    PUTSTATIC com/test/bean/StudentPrxoy0.method4 : Ljava/lang/reflect/Method;
    ALOAD 0
    LDC "java.lang.Object"
    INVOKESTATIC java/lang/Class.forName (Ljava/lang/String;)Ljava/lang/Class;
    LDC "toString"
    LDC 0
    MULTIANEWARRAY [Ljava/lang/Class; 1
    INVOKEVIRTUAL java/lang/Class.getMethod (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
    PUTSTATIC com/test/bean/StudentPrxoy0.method5 : Ljava/lang/reflect/Method;
    RETURN
   L1
   FRAME SAME
    ASTORE 0
    ALOAD 0
    INVOKEVIRTUAL java/lang/Exception.printStackTrace ()V
    RETURN
    MAXSTACK = 11
    MAXLOCALS = 1
}

原创粉丝点击