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" 的绑定?我是出于好奇才问的;在任何实际应用程序中,我当然会在我的代码中添加 final
、static
和 private
。
字节码编译器(如javac
)通常不会为实例方法调用进行早期绑定:
Java单独编译classes的模型意味着这种优化只能在class调用它的其中一个时应用方法。 (如果 javac
假设在 class 中进行了早期绑定,更改和重新编译一个 class 可能会导致绑定不正确。)
没有太多价值,因为 JIT 编译器(或 AOT 编译器生成器)是执行大多数优化的地方。
现代 JVM 中的 JIT 编译器根据已加载的整套 classes(到目前为止)进行了广泛的优化。这包括优化方法调度和内联方法调用。此外,JIT 编译器足够智能,可以跟踪关键优化,并在动态加载新的 class 使之前的优化无效时重新编译。
假设我有以下 class:
public class MyClass {
public void doSomething() {
System.out.println("doing something.");
}
}
让我们进一步假设,我的项目所做的就是调用 .something()
方法。没有压倒一切或任何其他有趣的事情发生。
MyClass myObj = new MyClass();
myObj.doSomething();
javac
编译器是否注意到此方法调用未被覆盖,并优化与 "early binding" 的绑定?我是出于好奇才问的;在任何实际应用程序中,我当然会在我的代码中添加 final
、static
和 private
。
字节码编译器(如javac
)通常不会为实例方法调用进行早期绑定:
Java单独编译classes的模型意味着这种优化只能在class调用它的其中一个时应用方法。 (如果
javac
假设在 class 中进行了早期绑定,更改和重新编译一个 class 可能会导致绑定不正确。)没有太多价值,因为 JIT 编译器(或 AOT 编译器生成器)是执行大多数优化的地方。
现代 JVM 中的 JIT 编译器根据已加载的整套 classes(到目前为止)进行了广泛的优化。这包括优化方法调度和内联方法调用。此外,JIT 编译器足够智能,可以跟踪关键优化,并在动态加载新的 class 使之前的优化无效时重新编译。