当前位置: 首页 > 工具软件 > jvms > 使用案例 >

java虚拟机 jvm 错误,Java虚拟机规范(JVMS):“5.4.5方法覆盖”中的错误

钮巴英
2023-12-01

我在2009年9月28日提交了以下错误.遗憾的是,我仍然没有得到任何回复,规范的最终版本仍然不正确.这真的是个bug吗?如果没有,为什么不呢?如果是,我该怎么办?

根据5.4.5 m1可以覆盖m2,即使m1是私有的.如果手动创建.class文件或组合两个编译中的.class,则会发生这种情况.

在我的例子中,我有A和B类,B扩展A.我编译这些类,使A包含一个名为f的公共方法,B包含一个私有方法,也称为f(首先声明两个方法public,compiling,copy A.类到安全的地方,删除A中的f声明并在B中更改为private,然后编译B并使用保存的A.class版本).

现在运行它时,我当前的Oracle JVM输出A(意味着调用A中的方法f).根据规范,B应该是输出(意味着应该调用B中的方法f).

编辑:实际上,B.f应该得到解决.如果调用者不是B,则由于对已解析方法的访问权限检查,调用可能会失败.但是,我认为方法解决部分是错误的.

我认为5.4.5中的定义应该检查m1的访问权限,而不仅仅是m2.

public class A {

public void f();

Code:

0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #3 // String A

5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

}

public class B extends A {

private void f();

Code:

0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #3 // String B

5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

}

谢谢,

卡斯滕

 类似资料: