为什么 Activity 中受保护的 android:onClick 方法实际上有效?

Why does a protected android:onClick method in Activity actually work?

假设您将 Activity 中的 android:onClick="doClick" 定义为

protected void doClick(View view) { }

documentation 表示

This name must correspond to a public method that takes exactly one parameter of type View.

这是底层 Class.getMethod() 方法的给定要求,它只找到 public 方法,因为 documentation 声明它

Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object.

那么,这个根本不应该工作的实现怎么可能在某些设备和模拟器上工作,而在其他使用相同 API 级别的设备和模拟器上却不起作用?

根据“The Java™ Tutorials”: protected 修饰符指定该成员只能在其自己的包内访问(与 package-private 一样),此外,它的 class 在另一个包

中的子class

我调试了特定的实现。代码的相关部分位于 支持库 中,使用 Class.getMethod()

如文档中所述,此方法只能找到 public 个成员方法并且行为正确。出于某种原因,Activity(这些是 onCreate()doClick())声明的受保护方法的所有修饰符都设置为 1,这意味着它们实际上是 public.

我只能观察到使用 Mac 创建 debug 构建的这种行为。所以为什么会发生这种情况仍然是一个悬而未决的问题,我正在努力寻找答案。