当前位置: 首页 > 知识库问答 >
问题:

JVM如何进行方法查找和调用?

羿博延
2023-03-14

方法在哪里?例如,

class Foo {
  public void foo_test(){}
}

Foo f1 = new Foo();
f1.foo_test();

(new Foo() {
  public void singleton_test(){
    foo_test();
  }
}).singleton_test();

方法是驻留在类中还是驻留在实例中?

JVM是否执行方法查找(如C vtable)?上面两个方法的调用是如何发生的?

我在看这一页:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

但它只是简单地解释了查找过程,而不是位置或任何细节。

这个问题与Oracle JVM特别相关。

共有1个答案

松秦斩
2023-03-14

Java中的所有方法都是虚拟的,除了标记为静态的方法。您的第二个示例简单地创建了一个匿名内部类,其行为几乎与命名类完全相同。(从这个角度来看,它的行为完全相同。)

方法查找的确切机制没有指定,这取决于虚拟机实现。这也为智能优化留出了空间,例如,如果一个方法没有覆盖另一个方法,并且被标记为<代码>最终 ,它可以决定不需要额外的间接。

 类似资料:
  • 问题内容: 在NetBeans中,如何找出在哪里调用方法? 我在一个大型项目中有一个特定的方法,无法找到它的调用位置。 问题答案: 右键单击方法名称时,会出现“ 查找用法” 菜单项。 或将光标放在方法名称上,然后按+ (查找用法)和++ + (显示“查找用法”结果)。

  • 我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?

  • 我一直在研究这三个网站,了解如何使用log4j2创建地图查找(或任何其他查找): http://logging.apache.org/log4j/2.x/manual/extending.html#Lookups http://logging.apache.org/log4j/2.x/manual/lookups.html http://logging.apache.org/log4j/2.x/m

  • 问题内容: 我有一个初始化方法,该方法在广泛的层次结构中使用和覆盖。但是,每个init调用都继承了先前的工作。很自然,我会: 当然,这将确保所有内容都被调用并实例化。我想知道的是:我可以创建一种方法来确保调用super方法吗?如果所有init都没有被调用,那么对象中会发生故障,因此如果有人忘记了调用,我想抛出异常或错误。 TYFT〜伊顿 问题答案: 如果派生类无法调用超类,这是引发异常的一种方法:

  • 问题内容: 我有一个非常简单的Java类,它使用输入验证以及明显的void set()和String get()方法来有效地装饰Map。 我希望能够有效地调用这些方法并从JVM外部处理返回值和异常,但仍在同一台计算机上 更新:我想到的调用者不是另一个JVM; 谢谢@戴夫雷 我的实施注意事项很典型 性能 易于实施和维护(简单吗?) 可靠性 灵活性(例如,我可以从远程计算机上拨打电话等) 有“正确的方

  • 问题内容: 因此,我开始学习使用Python和更高版本的Django进行编码。第一次很难查看回溯,实际上要弄清楚我做错了什么以及语法错误在哪里。现在已经过去了一段时间,并且我想我已经有了调试Django代码的例程。由于这是我编码经验的早期,所以我坐下来,想知道我的操作方式是否无效并且可以更快地完成。我通常设法找到并纠正代码中的错误,但是我想知道是否应该更快地执行该操作? 我通常只使用Django启