在字节码层面,Java方法的调用设计到如下几个字节码:
- invokestatic #index
调用静态方法,被调用方法的版本可在类加载解析阶段确定,并将符号引用转换为直接引用 - invokespecial #index
调用实例构造器,私有方法,父类方法,被调用方法的版本可在类加载解析阶段确定,并将符号引用转换为直接引用 - invokevirtual #index
1、调用final方法的版本确定时期同以上两种
2、其他被调用版本需要待运行期才能完全确定:
1)找到操作数栈顶第一个元素所执行的对象的实际类型C(确定接收者的实际类型)
2)如果在C中找到与常量描述符这简单名称均相对的方法,则进去访问权限校验,通过则返回方法的直接引用,否则抛IllegalAccessError
3)否则,按照继承关系,从下往上以此对C的各个父类进行第2步骤的搜索和验证过程
package com.cong.invoke_method;
class Task {
private String taskName;
public Task() {}
public Task(String taskName) {
this.taskName = taskName;
}
public String getTaskName() {
return this.taskName;
}
}
class HomeWork extends Task {
public HomeWork() {}
public HomeWork(Str