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

2022-09-01 12:19:29

假设您在android:onClick="doClick"Activity

protected void doClick(View view) { }

文档指出

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

这是基础方法的给定要求,它只查找文档声明的公共方法Class.getMethod()

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

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


答案 1

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


答案 2

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

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

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


推荐