方法调用的底层实现
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. 捕获 传入变量