走出趣网站怎么做,河南网站建设哪个公司做得好,怎样简单做网站,wordpress评论后显示文章目录 一、介绍二、方法调用的原理1、静态绑定2、动态绑定#xff08;1#xff09;介绍#xff08;2#xff09;原理 一、介绍
在JVM中#xff0c;一共有五个字节码指令可以执行方法调用#xff1a;
invokestatic: 调用静态方法。invokespecial#xff1a;调用对象… 文章目录 一、介绍二、方法调用的原理1、静态绑定2、动态绑定1介绍2原理 一、介绍
在JVM中一共有五个字节码指令可以执行方法调用
invokestatic: 调用静态方法。invokespecial调用对象的private方法、构造方法以及使用super关键字调用父类实例的方法、构造方法、以及所实现接口的默认方法。invokevirtual调用对象的非private方法。invokeinterface调用接口对象的方法。invokedynamic用于调用动态方法主要应用于lambda表达式中机制极为复杂了解即可。
二、方法调用的原理
Invoke指令执行时需要找到方法区中instanceKlass中保存的方法相关的字节码信息。但是方法区中有很多类每一个类又包含很多个方法怎么精确地确定到方法的位置呢
1、静态绑定
编译期间invoke指令会携带一个参数符号引用引用到常量池中的方法定义。方法定义中包含了类名方法名返回值参数。在方法第一次调用时这些符号引用就会被替换成内存地址的直接引用这种方式称之为静态绑定。静态绑定适用于处理静态方法、私有方法、或者使用final修饰的方法因为这些方法不能被继承之后重写。
2、动态绑定
1介绍
对于非static、非private、非final的方法有可能存在子类重写方法那么就需要通过动态绑定来完成方法地址绑定的工作。比如在下面这段代码中调用的其实是Cat类对象的eat方法但是编译完成之后虚拟机指令中调用的是Animal类的eat方法这就需要在运行过程中通过动态绑定找到Cat类的eat方法这样就实现了多态。
2原理
动态绑定是基于方法表来完成的invokevirtual使用了虚方法表vtable,invokeinterface使用了接口方法表itable整体思路类似。所以接下来使用invokevirtual和虚方法表来解释整个过程。
每个类中都有一个虚方法表本质上它是一个数组记录了方法的地址。子类方法表中包含父类方法表中的所有方法子类如果重写了父类方法则使用自己类中方法的地址进行替换。 产生invokevirtual调用时先根据对象头中的类型指针找到方法区中InstanceClass对象获得虚方法表。在根据方法表找到对应的对象获得方法的地址最后调用方法。