java - 如何访问按钮的 protected 字段?

标签 java android reflection

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

我需要将监听器分配给一个按钮并将其保存在变量中。

OnClickListener是Button类的保护域,继承自TextView,继承自View类。字段名称“mOnClickListener”。我什至通过反射(reflection)都无法得到它:

    ...
    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 我知道其他方法可以让我的应用在没有反射的情况下工作,只是想知道为什么它不起作用。

最佳答案

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

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

另一种方法:

Button.class.getField("mOnClickListener");

getField 方法包括从父类(super class)继承的字段。

关于java - 如何访问按钮的 protected 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14605136/

相关文章:

java - 如何用java从Sybase DB服务器获取所有数据库名称的列表

java - 查找字符串中第一个元音的索引

java - 尝试登录时 Firebase.AuthSateListener 未运行

java - 在运行时转换 NIO channel

android - 从图库或相机中选择图像并用所选图像替换按钮

java - 使用Java反射类创建对象并在arraylist中使用

java - forName 和 Class.forName 和 isInstance 的使用

java - Netty ByteToMessageDecoder 运行的次数超出了它必须的次数

c# - 如何从泛型定义和泛型参数中获取泛型类型?

android - 我如何安装支持库android?