假设我有以下课程:
public class MyClass {
public void doSomething() {
System.out.println("doing something.");
}
}
让我们进一步假设,我的项目所做的只是调用该.something()
方法。没有压倒一切或其他有趣的事情。
MyClass myObj = new MyClass();
myObj.doSomething();
javac
编译器是否注意到此方法调用未被覆盖,并且将绑定优化为“早期绑定”?我出于好奇而问。在任何实际应用程序中,我当然都会在我的代码中撒满final
,static
和private
。
答案 0 :(得分:2)
字节码编译器(例如javac
)通常不对实例方法调用进行早期绑定:
类的单独编译的Java模型意味着,只有当类正在调用其方法之一时,才能应用这种优化。 (如果假设javac
跨类进行了早期绑定,那么更改和重新编译一个类可能会导致绑定不正确。)
没有很大的价值,因为执行大多数优化的是JIT编译器(或AOT编译器生成器)。
现代JVM中的JIT编译器基于(到目前为止)已加载的完整类集进行了广泛的优化。这包括优化方法分配和内联方法调用。此外,JIT编译器足够聪明,可以跟踪关键的优化,并在动态加载新类等使先前的优化无效时重新编译。