Почему на самом деле работает защищенный метод android: onClick в действии?

Предположим, вы определили android:onClick="doClick" в своей Activity как

protected void doClick(View view) { }

В документации указывается, что

Это имя должно соответствовать общедоступному методу, который принимает ровно один параметр типа View.

Это заданное требование базового Class.getMethod(), который находит только общедоступные методы, поскольку в документации указано, что это

Возвращает объект Method который отражает указанный метод открытого элемента класса или интерфейса, представленный этим объектом Class.

Итак, как это возможно, что эта реализация, которая не должна работать вообще, работает на некоторых устройствах и эмуляторах, в то время как она не работает на других, используя те же уровни API?

Ответ 1

Я отлаживал конкретные реализации. Соответствующая часть кода находится в библиотеке поддержки, используя Class.getMethod().

Как указано в документации, этот метод обнаруживает только общедоступные методы и ведет себя корректно. По какой-то причине все модификаторы объявленных защищенных методов Activity (это onCreate() и doClick()) установлены в 1, что означает, что они фактически общедоступны.

Я мог наблюдать только это поведение, создавая сборку debug с помощью Mac. Так почему это происходит, остается открытым вопросом, на который я пытаюсь найти ответ.

Ответ 2

В соответствии с " Учебными пособиями Java ™ ": защищенный модификатор указывает, что к члену можно получить доступ только в своем собственном пакете (как и в пакете private) и, кроме того, подклассом его класса в другом пакете

Ответ 3

Далее происходит под:

View конструктор "разбирает" его атрибуты и если onClick значения атрибута != null он устанавливает анонимный onClickListener на View. В рамках реализации слушателя объект отражения Метод создан и один раз клик происходит Method метод с именем, присвоенным в xml является вызывается с помощью отражения.

Это причина, по которой protected void doClick(View view). Это не было бы, если бы ваш Activity/Fragment реализовал View.OnClickListener с protected void onClick(View view).

Я не могу сказать, почему он работает с устройства на устройство. Мое лучшее предположение - это разные версии Android.