实现invokespecial指令和invokevirtual

本文介绍了作者实现Java虚拟机指令的过程,重点讨论了new、invokespecial和invokevirtual指令的实现细节,特别是在权限检查方面遇到的问题。通过一个具体示例验证了invokevirtual指令的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自从上次实现new指令之后,我没有马上实现invokespecial指令,因为对于invokespecial指令的理解需要时间。现在基本实现了invokesecial指令,但是在权限检查上遇到一个困难,主要是派生类对于基类protected实例成员(非静态成员)的访问。这个问题暂时忽视了。接着实现了invokevirtual指令,也遇到访问权限方面的疑问。我参考“深入java虚拟机”的一个例子,这个例子测试通过了,如下。

Superclass.java

class Superclass {
private void interestingMethod() {
//System.out.println("Superclass's interesting method.");
}

void exampleMethod() {
interestingMethod();
}
}


Subclass.java

class Subclass extends Superclass {
void interestingMethod() {
//System.out.println("Subclass's interesting method.");
}

public static void main(String args[]) {
main();
}

public static void main() {
Subclass me = new Subclass();
me.exampleMethod();
}
}


用javac编译上述两个java文件,然后编译和运行虚拟机。虚拟机代码参考附件,同样这一次的版本我在visual studio以及cygwin下都编译通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值