Skip to content

Latest commit

 

History

History
52 lines (32 loc) · 1.88 KB

02.方法调用.md

File metadata and controls

52 lines (32 loc) · 1.88 KB

方法调用

桥接方法

​ 在字节码中桥接方法会被标记为ACC_BRIDGE和ACC_SYNTHETIC,其中ACC_BRIDGE用于说明这个方法是由编译生成的桥接方法,ACC_SYNTHETIC说明这个方法是由编译器生成,并且不会在源代码中出现。

场景一:

​ 一个子类在继承(或实现)一个父类(或接口)的泛型方法时,在子类中明确指定了泛型类型,那么在编译时编译器会自动生成桥接方法

如何通过桥接方法获取实际的方法

​ 我们在通过反射进行方法调用时,如果获取到桥接方法对应的实际的方法呢?可以查看spring中org.springframework.core.BridgeMethodResolver类的源码。实际上是通过判断方法名、参数的个数以及泛型类型参数来获取的。

虚方法

​ Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令。这两种指令,均属于 Java 虚拟机中的虚方法调用。

动态绑定:

​ Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。

​ 空间换时间:

​ 为每个类生成一张方法表,以快速定位到目标方法

​ 优化:

​ 内联缓存:缓存虚方法调用中调用者的动态类型,以及该类型对应的目标方法

方法内联:

方法表的实现

​ 虚方法表、接口方法表

​ 方法表:本质是一个数组,每个数组元素指向当前类及其祖先类中非私有的实例方法(具体的、可执行的或者是抽象方法)

静态绑定:

​ 静态绑定包括用于调用静态方法的 invokestatic 指令,和用于调用构造器、 私有实例方法以及超类非私有实例方法的 invokespecial 指令