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

x33g5p2x  于2022-03-19 转载在 Java  
字(1.1k)|赞(0)|评价(0)|浏览(210)

一、方法调用指令

指令作用
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命令查看字节码指令

相关文章

微信公众号

最新文章

更多