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

Can the Java compiler do early binding for non-static methods?

假设我有以下 class:

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

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

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

javac 编译器是否注意到此方法调用未被覆盖,并优化与 "early binding" 的绑定?我是出于好奇才问的;在任何实际应用程序中,我当然会在我的代码中添加 finalstaticprivate

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

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

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

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