Почему компилятор 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 Метод был законным. Отражение обрабатывает проверки видимости для объявленного типа метода, который затем ошибочно делает вывод, что метод не был виден и его вызов недопустим.

Согласно документации на билете, не было более легкого обходного пути. Однако неотражающий вызов обрабатывался нормально, даже до того, как был добавлен метод моста.

Другие вопросы по тегам