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

时间:2018-05-29 21:11:24

标签: java android reflection android-source

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

protected void doClick(View view) { }

documentation表示

  

此名称必须对应于一个公共方法,该方法只接受View类型的一个参数。

这是基础Class.getMethod()方法的给定要求,它只发现公共方法为documentation状态

  

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

那么,这个实现根本不适用的实现在某些设备和模拟器上是如何工作的呢?虽然它在使用相同API级别的其他设备上也不起作用?

2 个答案:

答案 0 :(得分:0)

根据“The Java™ Tutorials”: protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中使用其类的子类

答案 1 :(得分:0)

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

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

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