>假设您将Activity
中的android:onClick="doClick"
定义为
protected void doClick(View view) { }
文件指出
此名称必须对应于只采用一个 View 类型的参数的公共方法。
这是基础Class.getMethod()
方法的给定要求,该方法仅查找公共方法,因为文档指出它
返回一个
Method
对象,该对象反映此Class
对象所表示的类或接口的指定公共成员方法。
那么,这种根本不应该工作的实现怎么可能在某些设备和模拟器上工作,而在其他使用相同 API 级别的设备和模拟器上也不起作用呢?
根据"Java™教程": 受保护的修饰符指定成员只能在其自己的包中访问(与包私有一样(,此外,还可以通过另一个包中其类的子类访问
我调试了特定的实现。代码的相关部分位于使用Class.getMethod()
的支持库中。
如文档中所述,此方法仅查找公共成员方法并正常运行。出于某种原因,Activity
的所有声明受保护方法的修饰符(这些是onCreate()
和doClick()
(都设置为1
,这意味着这些实际上是公共的。
我只能观察到这种行为,使用 Mac 创建debug
构建。所以为什么会发生这种情况仍然是一个悬而未决的问题,我试图找到答案。