`
chenzhou123520
  • 浏览: 4249764 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM学习笔记(五):根据字节码指令介绍方法执行流程

阅读更多

     在上一篇博客中介绍了《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


}

 

方法的调用指令分为以下几种:

  1. invokevirtual指令用于调用所有的虚方法。
  2. invokeinterface指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
  3. invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例构造器<init>化方法、私有方法和父类方法。
  4. invokestatic指令用于调用静态方法(static方法)。

其它具体的指令可以参考:字节码指令集

分享到:
评论

相关推荐

    jvm字节码自动加载

    jvm字节码自动加载jvm字节码自动加载jvm字节码自动加载jvm字节码自动加载jvm字节码自动加载

    java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器)

    jvm指令手册 +JVM必知必会,掌握虚拟机编译过程.rar

    《JVM必知必会》记录了对JVM的总结及学习笔记,详解的介绍了什么是jvm,以及弄清楚jvm的工作原理等等,会深入了解JVM有一定的帮助。 Java Virtual Machine(Java虚拟机),它bai是一个虚构出来du的计算机,是通过在...

    JVM学习笔记(一)

    一份JVM学习的笔记,含查看JVM运行时信息\JVM垃圾收集信息\JVM锁信息等

    第2章:字节码指令集与解析举例.mmap

    第2章:字节码指令集与解析举例.mmap

    JVM学习笔记.docx

    JVM学习笔记.docx

    jVM学习笔记.ppt

    jVM学习笔记.ppt

    JVM 字节码从入门到精通

    这篇文章我们以输出 "Hello, World" 来开始字节码之旅,如果之前没有怎么接触过字节码的话,这篇⽂章应该能够让你对字节码有⼀个最基本的认识。

    java之jvm学习笔记十一(访问控制器)-源码

    java之jvm学习笔记十一(访问控制器)-源码

    Java学习笔记

    b) JVM:真正解释字节码文件内容并且和操作 系统交互的部分 Sun(Oracle)已经给每一 款操作系统都写好了现成的JVM JVM组成部分: 类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 ...

    JVM 11.字节码执行

    11.字节码执行

    深入理解JVM.rar

    每个使用Java的开发者都知道Java字节码是在JRE中运行,而JVM则是JRE中的核心组成部分,承担分析和执行Java字节码的工作,而Java程序员通常并不需要深入了解JVM运行情况就可以开发出大型应用和类库。尽管如此,如果你...

    JVM学习笔记

    从JVM内存模型、常用JVM参数、垃圾回收算法和垃圾回收器等几个角度学习JVM

    jvm字节码与类的加载.xmind

    自己总结的jvm中字节码与类的加载的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者

    JVM指令码.htm

    JVM指令码表,JVM运行原理学习的必备工具。常量入栈指令、局部变量值转载到栈中指令、将栈顶值保存到局部变量中指令、wide指令、通用(无类型)栈操作指令、类型转换指令、整数运算、浮点运算等指令。

    JVM指令码表.zip

    java的字节码指令码表,根据class文件中的指令查询相应的操作。本来想不要积分的,但是收集资料不容易,还是要一个积分吧。

    JVM学习笔记(缓慢更新).md

    JVM学习笔记(缓慢更新).md

    JVM执行子系统原理

    详细介绍了JVM执行子系统的工作原理,包括类文件结构与字节码指令(Class类文件结构、JVM字节码指令简介)、JVM类加载机制(类加载器、类加载时机、类加载过程)、字节码执行引擎(运行时候的栈结构、方法调用、方法...

    JVM+学习笔记资源合集

    JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过...

    jvm学习笔记.zip

    jvm经典笔记

Global site tag (gtag.js) - Google Analytics