关于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
}
- 关于class文件中的指令剖析
- 关于头文件中的include 和class引…
- 关于Python中的class
- HLSL中的MUL指令深层剖析
- HLSL中的MUL指令深层剖析
- HLSL中的MUL指令深层剖析
- 关于Class文件
- Class文件中的秘密
- java中的class文件
- 关于jar包中的.class与项目中未打包.class文件的先后。
- 关于jdk中的各种指令
- 剖析VC中的文件操作
- 剖析VC中的文件操作
- 剖析VC中的文件操作
- 剖析VC中的文件操作
- 剖析VC中的文件操作
- 剖析VC中的文件操作
- 剖析VC中的文件操作
- php与mysql程序设计 读书笔记——张迅雷闪击PHP(1-6章)
- java中使用asm实现动态创一个类动态代理
- linux设备驱动开发详解 阅读笔记2(第一篇入门)
- Debian 5 lenny 的安装全过程
- C++ 模板类型萃取技术
- 关于class文件中的指令剖析
- java中关于Struts和spring集成的一些原理剖析
- java中Excel操作的简单封装
- 转一些Linux进程间通信的(IPC)的一些文章(来源于IBM developerworks)
- 用 C++开发了一个Sql Server加密解密的存储过程,同时在此基础上写了两个加密解密的函数
- java Random类详解
- java中关于Tree的操作的小例子
- Tiles框架的配置
- php与mysql程序设计 读书笔记——张迅雷闪击PHP(7-9章)