Общеизвестно, что Java-компилятор (почти) всегда решает статические методы во время компиляции. Например:Устранение статического метода во время компиляции
public class Super {
static void someMethod() {
// Do something...
}
}
public class Derived extends Super {
// Some other methods, excluding someMethod
}
тестовый код:
Derived derived = new Derived();
derived.someMethod();
Это должен вызвать Super.someMethod(), не так ли? И это должно быть разрешено во время компиляции, так что javac будет генерировать invokestatic Super.someMethod
, но я видел, что он генерирует invokestatic Derived.someMethod
. Почему это так? И есть ли способ каким-то образом изменить это поведение?
Пожалуйста, исправьте меня, если я ошибаюсь.
Javac компилятор разрешает * все * метод ссылки во время компиляции, с точки зрения нахождения метода и проверки его подписи. Однако фактическое «привязка» к методу выполняется, когда класс загружается JVM или при первом вызове. –
(Почему вы хотите изменить поведение? Очень полезно, как это работает.) –
Ваш код даже не компилируется. Как вы получаете этот байтовый код? –