【问题标题】:Can the Java compiler do early binding for non-static methods?Java 编译器可以对非静态方法进行早期绑定吗?
【发布时间】:2019-11-20 03:57:10
【问题描述】:

假设我有以下课程:

public class MyClass {
    public void doSomething() {
        System.out.println("doing something.");
    }
}

让我们进一步假设,我的项目所做的只是调用 .something() 方法。没有压倒一切或任何其他有趣的事情发生。

MyClass myObj = new MyClass();
myObj.doSomething();

javac 编译器是否注意到此方法调用没有被覆盖,并优化绑定到“早期绑定”?我是出于好奇而问的;在任何现实世界的应用程序中,我当然会在我的代码中添加finalstaticprivate

【问题讨论】:

  • 答案当然取决于您使用的哪个编译器...但是编译器不需要这样做才能被视为Java编译器,而我的机器上没有。
  • 如果您使用class loader 加载runtime 的类并扩展MyClass 并覆盖doSomething(),会发生什么?

标签: java late-binding early-binding


【解决方案1】:

字节码编译器(如javac)通常不会对实例方法调用进行早期绑定:

  1. 类单独编译的Java模型意味着这种优化只能在类调用其方法之一时应用。 (如果javac 假设在类之间进行了早期绑定,那么更改和重新编译一个类可能会导致绑定不正确。)

  2. 没有太大的价值,因为 JIT 编译器(或 AOT 编译器生成器)是执行大多数优化的地方。

现代 JVM 中的 JIT 编译器基于已加载的完整类集(到目前为止)进行了广泛的优化。这包括优化方法分派和内联方法调用。此外,JIT 编译器足够智能,可以跟踪关键优化,并在动态加载新类等使之前的优化无效时重新编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2010-09-11
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多