Java字节码分析(一)
2014-05-08 17:34
295 查看
今天练习的内容,见如下类定义:
一行一行分析:
第一行:
分析上面的字节码,NEW生成一个对象并压栈,即站上有一个ClassDemo对象,但是此对象是未初始化的对象,
需要调用缺省构造函数进行初始化,所以调用DUP指令,这样栈顶就有两个ClassDemo对象的引用,然后通过
INVOKESPECIAL调用构造函数,即弹出栈顶一个对象引用,初始化完毕,通过ASTOR将栈顶的对象引用赋给
本地变量1。
(注:INVOKESPECIAL主要出发三类方法的调用:1、构造函数(<init>);2、私有成员方法(private method);
3、父类方法(super),比如new StringBuffer对应的字节码如下:
第二行:
import java.lang.reflect.Field; public class ClassDemo { public static void main(String[] args) { try { ClassDemo c = new ClassDemo(); Class cls = c.getClass(); // field long l Field lVal = cls.getDeclaredField("l"); System.out.println("Field = " + lVal.toString()); } catch(Exception e) { System.out.println(e.toString()); } } }
一行一行分析:
第一行:
ClassDemo c = new ClassDemo();这是要new一个ClassDemo对象,字节码如下:
NEW ClassDemo DUP INVOKESPECIAL ClassDemo.<init>()V ASTORE 1
分析上面的字节码,NEW生成一个对象并压栈,即站上有一个ClassDemo对象,但是此对象是未初始化的对象,
需要调用缺省构造函数进行初始化,所以调用DUP指令,这样栈顶就有两个ClassDemo对象的引用,然后通过
INVOKESPECIAL调用构造函数,即弹出栈顶一个对象引用,初始化完毕,通过ASTOR将栈顶的对象引用赋给
本地变量1。
(注:INVOKESPECIAL主要出发三类方法的调用:1、构造函数(<init>);2、私有成员方法(private method);
3、父类方法(super),比如new StringBuffer对应的字节码如下:
new java/lang/StringBuffer ; create a new StringBuffer dup ; make an extra reference to the new instance ; now call an instance initialization method invokespecial java/lang/StringBuffer/<init>()V ; stack now contains an initialized StringBuffer.
第二行:
Class cls = c.getClass();这行代码,是调用上面生成的对象,返回其class对象,字节码如下:
ALOAD 1 INVOKEVIRTUAL java/lang/Object.getClass()Ljava/lang/Class; ASTORE 2将变量1的对象引用(注意是对象引用)压栈,调用其getClass方法,将该class对象赋给本地变量2。(不详细解释了,参考上面)
Field lVal = cls.getDeclaredField("l");这行代码是返回cls对象的l字段,这就很简单了,字节码如下:
ALOAD 2 LDC "l" INVOKEVIRTUAL java/lang/Class.getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field; ASTORE 3首先将对象引用压栈,接着将参数压栈,然后调用getDeclaredField方法,齐活!
相关文章推荐
- Eclipse上GIT插件EGIT使用手册之一_安装EGIT插件
- 旺旺老师JavaSE基础第二章(01)IDE工具
- java环境变量配置(windows7)
- Eclipse调试Java的10个技巧
- poi excel自动转换成javabean 支持引用类型属性二级转换
- IOS 基于APNS消息推送原理与实现(JAVA后台)--转
- 对struts2日期处理的思考(一)
- strus注解型文件下载
- Spring <context:annotation-config/> 解说(转)
- Eclipse上GIT插件EGIT使用手册之七_推送远程仓库
- java的几大排序
- eclipse安装velocity插件
- java中直接使用Println()
- Eclipse 打JAR包,插件FatJar 安装与使用
- Java中String的spilt
- Eclipse 打JAR包,插件FatJar 安装与使用
- Eclipse 在线安装fat jar插件
- Eclipse 在线安装fat jar插件
- Spring事务管理接口PlatformTransactionManager的实现类DataSourceTransactionManager
- java 软件工程师学习路径(多年工作经验高级工程师推荐)