Java编译器可以对非静态方法进行早期绑定吗?

时间:2019-07-10 13:46:32

标签: java late-binding early-binding

假设我有以下课程:

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

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

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

javac编译器是否注意到此方法调用未被覆盖,并且将绑定优化为“早期绑定”?我出于好奇而问。在任何实际应用程序中,我当然都会在我的代码中撒满finalstaticprivate

1 个答案:

答案 0 :(得分:2)

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

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

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

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