jvm(7)

方法调用的底层实现
1. 一般我们写的代码都是经过编译,类加载,进入运行时数据区,一般是方法区,人关注的是方法的执行
2. jvm关注的是字节码的执行,
3. main函数是指令的起点,jvm创建main线程执行main方法,出发jvm的一些列指令,使jvm跑起来
4. 所以要了解在jvm中 方法调用方法的过程

方法调用的字节码指令
1. invokestatic 调用静态方法
2. invokespecial 调用私有实例方法
3. invokevirtual 调用非私有实例方法(final 除外)
4. invokeinterface 调用非私有接口
5. invokedynamic 调用动态方法

非虚方法
1. 如果方法在编译器就确定了具体的调用版本,运行时不可变
2. invokestatic;invokespecial

虚方法
1. 与非虚方法相反的,在方法在运行过程中是可变的
2. jvm根据调用者的类型确定调用的目标方
3. invokevirual;invokeinterface

静态分派
1. 多用于方法的重载(方法名相同,方法的类型或者个数不同)
2.
3.

动态分派
1. 多用于放的重写
2.
3. jvm中虚拟机栈中的动态链接就是invokevirtual将引用变成直接引用

方法表
1. 动态分派会导致jvm频繁搜索元数据,所以建了个方法表
2.

lambda表达式
1. invokedynamic 动态调用,类似反射,但是比反射快,权限没有反射大
2. 创建methodtype,methodhandle 句柄,传入方法参数到handle调用方法

lambda的捕获与非捕获
1. 非捕获 不传入变量
2. 捕获 传入变量

原文地址:https://www.cnblogs.com/xiaoshahai/p/13436827.html