为什么 Activity 中受保护的 android:onClick 方法实际上有效?
Why does a protected android:onClick method in Activity actually work?
假设您将 Activity
中的 android:onClick="doClick"
定义为
protected void doClick(View view) { }
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
构建的这种行为。所以为什么会发生这种情况仍然是一个悬而未决的问题,我正在努力寻找答案。
假设您将 Activity
中的 android:onClick="doClick"
定义为
protected void doClick(View view) { }
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 thisClass
object.
那么,这个根本不应该工作的实现怎么可能在某些设备和模拟器上工作,而在其他使用相同 API 级别的设备和模拟器上却不起作用?
根据“The Java™ Tutorials”: protected 修饰符指定该成员只能在其自己的包内访问(与 package-private 一样),此外,它的 class 在另一个包
中的子class我调试了特定的实现。代码的相关部分位于 支持库 中,使用 Class.getMethod()
。
如文档中所述,此方法只能找到 public 个成员方法并且行为正确。出于某种原因,Activity
(这些是 onCreate()
和 doClick()
)声明的受保护方法的所有修饰符都设置为 1
,这意味着它们实际上是 public.
我只能观察到使用 Mac 创建 debug
构建的这种行为。所以为什么会发生这种情况仍然是一个悬而未决的问题,我正在努力寻找答案。