如何访问Button的受保护字段?

时间:2013-01-30 13:24:15

标签: java android reflection

我们在Android中有方法为Button设置OnClickListener(button.setOnClickListener(....),但没有.getOnClickListener。

我需要将侦听器分配给Button并将其保存在变量中。

OnClickListener是Button类的受保护字段,继承自TextView,继承自View类。字段“mOnClickListener”的名称。我甚至无法通过反思得到它:

    ...
    Button button1 = (Button) findViewById(R.id.button1);
    OnClickListener listener = getListener(button1);
    ...

    public OnClickListener getListener(Button b) {

 java.lang.reflect.Field field =  b.getClass().getSuperclass().getSuperclass().getDeclaredField("mOnClickListener");
...
    }

获得“noSuchFieldException”。有什么想法可以实现吗?

PS我知道其他方法可以使我的应用无需反思,只是想知道为什么它不起作用。

3 个答案:

答案 0 :(得分:2)

您正在课堂上调用方法getClass。相反,您应该在getClass类的对象上调用Button,或使用类字段:

Button.class.getSuperClass().getSuperClass().getDeclaredField("mOnClickListener"):

另一种方法:

Button.class.getField("mOnClickListener");

方法getField包含从超类继承的字段。

答案 1 :(得分:1)

你想让田野可以进入。

所以你基本上会找到像

这样的东西
Field f = obj.getClass().getDeclaredField("mOnClickListener");
f.setAccessible(true);

答案 2 :(得分:1)

您收到此错误是因为您不是从按钮开始。而是这样做:

 java.lang.reflect.Field field =  View.class.getField("mOnClickListener");

当你有字段使其可访问时:

try{
   field.setAccessible(true);
   Object clickListener = field.get(b);
   field.setAccessible(false);
}catch(Exception e){
    e.printStacktrace();
}