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



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

protected void doClick(View view) { }

文件指出

此名称必须对应于只采用一个 View 类型的参数的公共方法。

这是基础Class.getMethod()方法的给定要求,该方法仅查找公共方法,因为文档指出它

返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定公共成员方法。

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

根据"Java™教程": 受保护的修饰符指定成员只能在其自己的包中访问(与包私有一样(,此外,还可以通过另一个包中其类的子类访问

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

如文档中所述,此方法仅查找公共成员方法并正常运行。出于某种原因,Activity的所有声明受保护方法的修饰符(这些是onCreate()doClick()(都设置为1,这意味着这些实际上是公共的。

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