深入理解Java虚拟机——方法调用和返回指令

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解Java虚拟机——方法调用和返回指令相关的知识,希望对你有一定的参考价值。

目录

一、方法调用指令

指令作用
invokevirtual用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是java语言中最常见的方法分派方式
invokeinterface用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用
invokespecial用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和复类方法
invokestatic用于调用类方法(static方法)
invokedynamic用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法
  • invokevirtual 、invokeinterface 、invokespecial 和invokestatic调用指令的分派逻辑都固化在Java虚拟机内部。
  • invokedynamic 指令的分派逻辑是由用户设定的引导方法决定的。
  • 方法调用指令与数据类型无关,而 方法返回指令是根据返回值的类型区分 ,包括ireturn(当返回值是boolean、byte、char、short、和int类型时使用)、lreturn、freturn、dreturn和areturn,另外还有一条return指令供声明为void的方法、实例初始化方法以及类和接口的类初始化方法使用。

二、方法调用指令的示例

  • 代码

    public class Test1
    	public static void main(String []args)
    		UserService us=new UserServiceImpl();
    		int result=us.add(1,2);
    		
    	
    	
    
    
    interface UserService
    	int add(int a,int b);
    
    
    class UserServiceImpl implements UserService
    	public int add(int a,int b)
    		return a+b;
    	
    
    
  • 执行javac命令编译成.class文件

  • 执行javap命令查看字节码指令

三、方法返回指令的示例

  • 代码

    public class Test1
    	public static void main(String []args)
    		UserService us=new UserServiceImpl();
    		int result=us.add(1,2);
    		
    	
    	
    
    
    interface UserService
    	int add(int a,int b);
    
    
    class UserServiceImpl implements UserService
    	public int add(int a,int b)
    		return a+b;
    	
    
    
  • 执行javac命令编译成.class文件

  • 执行javap命令查看字节码指令


以上是关于深入理解Java虚拟机——方法调用和返回指令的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java虚拟机——同步指令

深入理解Java虚拟机——同步指令

深入理解Java虚拟机——方法调用(解析调用)

深入理解Java虚拟机06--虚拟机字节码执行引擎

深入理解Java虚拟机——运行时栈帧结构(方法返回地址和附加信息)

深入理解java虚拟机:字节码执行引擎介绍-栈帧