- 浏览: 4249764 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
masuweng:
...
kaptcha验证码组件使用简介 -
caobingyi:
你好,问下html是怎么调用loginCheck方法的?
kaptcha验证码组件使用简介 -
hayoouch:
XieFuQ 写道既然都考虑到乐观锁了,是否可以直接换表存储引 ...
mysql乐观锁总结和实践 -
murdonson:
辛苦了
mysql悲观锁总结和实践 -
iamnotstar:
写得不错,感谢分享
memcached-session-manager配置
在上一篇博客中介绍了《Class文件结构》,其中就提到了一个例子,下面我们依然根据该例子的字节码来对方法的执行流程进行讲解。
java类源码如下:
public class TestClass{ private int num; public int inc(){ for(int i=0; i<10; i++){ num = i; } return num; } public static void main(String[] args){ new TestClass().inc(); } }
使用javap -verbose命令反编译后,输出常量表和字节码如下:
D:\JVM>javap -verbose TestClass Compiled from "TestClass.java" public class TestClass extends java.lang.Object SourceFile: "TestClass.java" minor version: 0 major version: 50 Constant pool: const #1 = Method #6.#20; // java/lang/Object."<init>":()V const #2 = Field #3.#21; // TestClass.num:I const #3 = class #22; // TestClass const #4 = Method #3.#20; // TestClass."<init>":()V const #5 = Method #3.#23; // TestClass.inc:()I const #6 = class #24; // java/lang/Object const #7 = Asciz num; const #8 = Asciz I; const #9 = Asciz <init>; const #10 = Asciz ()V; const #11 = Asciz Code; const #12 = Asciz LineNumberTable; const #13 = Asciz inc; const #14 = Asciz ()I; const #15 = Asciz StackMapTable; const #16 = Asciz main; const #17 = Asciz ([Ljava/lang/String;)V; const #18 = Asciz SourceFile; const #19 = Asciz TestClass.java; const #20 = NameAndType #9:#10;// "<init>":()V const #21 = NameAndType #7:#8;// num:I const #22 = Asciz TestClass; const #23 = NameAndType #13:#14;// inc:()I const #24 = Asciz java/lang/Object; { public TestClass(); Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public int inc(); Code: Stack=2, Locals=2, Args_size=1 0: iconst_0 //定义一个常量0,放入操作数栈 1: istore_1 //把该常量弹出栈顶存入到局部变量表 2: iload_1 //把该局部变量放入操作数栈 3: bipush 10 //把常量10放入操作数栈 5: if_icmpge 19 //把i和10进行比较 8: aload_0 //加载局部变量表index为0的变量放入操作数栈 9: iload_1 //加载局部变量表index为1的变量放入操作数栈 10: putfield #2; //Field num:I //把i的值赋给num字段 13: iinc 1, 1 //局部变量i自增1 16: goto 2 //跳转到第2行 19: aload_0 //加载局部变量表index为0的变量放入操作数栈 20: getfield #2; //Field num:I //获取字段num的值 23: ireturn //返回 LineNumberTable: line 5: 0 line 6: 8 line 5: 13 line 8: 19 StackMapTable: number_of_entries = 2 frame_type = 252 /* append */ offset_delta = 2 locals = [ int ] frame_type = 250 /* chop */ offset_delta = 16 public static void main(java.lang.String[]); Code: Stack=2, Locals=1, Args_size=1 0: new #3; //class TestClass 3: dup 4: invokespecial #4; //Method "<init>":()V //调用实例初始化方法 7: invokevirtual #5; //Method inc:()I //调用普通方法inc() 10: pop 11: return LineNumberTable: line 12: 0 line 13: 11 }
方法的调用指令分为以下几种:
- invokevirtual指令用于调用所有的虚方法。
- invokeinterface指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
- invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例构造器<init>化方法、私有方法和父类方法。
- invokestatic指令用于调用静态方法(static方法)。
其它具体的指令可以参考:字节码指令集
发表评论
-
kaptcha验证码组件使用简介
2013-12-10 11:53 46278Kaptcha是一个基于SimpleC ... -
由缓存导致的一个java序列化问题
2013-09-24 22:38 11333背景描述: 项目是普 ... -
使用maven插件对java工程进行打包
2012-10-26 17:30 51148现在基本上都是采用maven来进行开发管理,我有一个需求是需要 ... -
Spring拦截器中通过request获取到该请求对应Controller中的method对象
2012-10-21 16:51 160528背景:项目使用Spring 3.1.0.RELEASE,从da ... -
JVM学习笔记(九):基于栈的解释器执行过程
2012-07-26 00:37 5125本文根据《深入理解java ... -
JVM学习笔记(八):类加载器以及双亲委派模型介绍
2012-07-19 21:02 7779本章内容根据《深入理解Java虚拟机》第7章部分内容整理 ... -
JVM学习笔记(七):类加载的过程
2012-07-19 18:59 3635本文根据《深入理解java虚拟机》第7章部分内容整理 ... -
JVM学习笔记(六):类加载的时机
2012-07-18 14:58 8609本文根据《深入理解java ... -
JVM学习笔记(四):Class文件结构
2012-07-17 18:29 5452本文根据《深入理解Java ... -
JVM学习笔记(三):JVM的垃圾回收
2012-07-12 21:06 4136注:本文根据《深入理解Java虚拟机》第3章部分内容整理而成 ... -
JVM学习笔记(二):JVM中对象访问的两种方式
2012-07-11 18:32 4353由于Reference类型在Java虚拟机规范里面只规定 ... -
JVM学习笔记(一):运行时数据区
2012-07-11 17:31 10583运行时数据区 java虚拟机定义了若干种程序运行时使 ... -
MyBatis批量插入数据
2012-07-10 08:50 433795在程序中封装了一个List集合对象,然后需要把该集合中的实体插 ... -
Maven依赖管理
2012-07-08 23:35 4847Maven提供dependencyManagemen ... -
Maven聚合与继承
2012-07-08 23:22 36682Maven聚合与继承 一、聚合 为了能够使用 ... -
Java -verbose:gc 命令
2012-07-08 23:12 27975Java -verbose:gc 中参数-verbo ... -
java.lang.NoClassDefFoundError: org/aspectj/weaver/BCException
2012-06-18 10:27 30972在项目中使用了Spring管理和配置事务,在启动tom ... -
java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
2012-06-18 10:24 6246在项目中用到了bonecp连接池,启动tomcat时 ... -
常用的JDBC各种数据库连接
2012-06-04 18:15 18671、Oracle8/8i/9i数据库(thin模式) ... -
JDBC连接执行MySQL存储过程报权限错误
2012-05-28 14:40 16376在java中通过JDBC连接MySQL执行存储过程时报错: ...
相关推荐
jvm字节码自动加载jvm字节码自动加载jvm字节码自动加载jvm字节码自动加载jvm字节码自动加载
java之jvm学习笔记五(实践写自己的类装载器)
《JVM必知必会》记录了对JVM的总结及学习笔记,详解的介绍了什么是jvm,以及弄清楚jvm的工作原理等等,会深入了解JVM有一定的帮助。 Java Virtual Machine(Java虚拟机),它bai是一个虚构出来du的计算机,是通过在...
一份JVM学习的笔记,含查看JVM运行时信息\JVM垃圾收集信息\JVM锁信息等
第2章:字节码指令集与解析举例.mmap
JVM学习笔记.docx
jVM学习笔记.ppt
这篇文章我们以输出 "Hello, World" 来开始字节码之旅,如果之前没有怎么接触过字节码的话,这篇⽂章应该能够让你对字节码有⼀个最基本的认识。
java之jvm学习笔记十一(访问控制器)-源码
b) JVM:真正解释字节码文件内容并且和操作 系统交互的部分 Sun(Oracle)已经给每一 款操作系统都写好了现成的JVM JVM组成部分: 类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 ...
11.字节码执行
每个使用Java的开发者都知道Java字节码是在JRE中运行,而JVM则是JRE中的核心组成部分,承担分析和执行Java字节码的工作,而Java程序员通常并不需要深入了解JVM运行情况就可以开发出大型应用和类库。尽管如此,如果你...
从JVM内存模型、常用JVM参数、垃圾回收算法和垃圾回收器等几个角度学习JVM
自己总结的jvm中字节码与类的加载的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者
JVM指令码表,JVM运行原理学习的必备工具。常量入栈指令、局部变量值转载到栈中指令、将栈顶值保存到局部变量中指令、wide指令、通用(无类型)栈操作指令、类型转换指令、整数运算、浮点运算等指令。
java的字节码指令码表,根据class文件中的指令查询相应的操作。本来想不要积分的,但是收集资料不容易,还是要一个积分吧。
JVM学习笔记(缓慢更新).md
详细介绍了JVM执行子系统的工作原理,包括类文件结构与字节码指令(Class类文件结构、JVM字节码指令简介)、JVM类加载机制(类加载器、类加载时机、类加载过程)、字节码执行引擎(运行时候的栈结构、方法调用、方法...
JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过...
jvm经典笔记