Почему компилятор Java добавляет методы моста видимости для открытых методов, определенных в закрытых супертипах типа?
Мне интересно, почему компилятор Java добавил бы метод моста для foo
метод здесь:
public class Outer {
class SuperClass {
public void foo() { }
}
public class SubClass extends SuperClass { }
}
foo
Метод составлен так, чтобы public
в SuperClass
тип. Тем не менее, SubClass
Метод переопределяет метод как мост к тому же методу. Интересно, зачем нужен этот мост.
1 ответ
Рациональным для добавления этого метода моста является угловой случай в API отражения Java, который может привести к IllegalAccessException
без добавления метода моста. Ошибка документирована здесь в трекере ошибок Oracle:
Рефлексивный вызов
Subclass.class.getMethod("foo").invoke(new Subclass())
не был правильно обработан из других пакетов, кроме SuperClass
без исправления метода моста, так как среда выполнения Java не могла понять, что вызов foo
Метод был законным. Отражение обрабатывает проверки видимости для объявленного типа метода, который затем ошибочно делает вывод, что метод не был виден и его вызов недопустим.
Согласно документации на билете, не было более легкого обходного пути. Однако неотражающий вызов обрабатывался нормально, даже до того, как был добавлен метод моста.