我有以下课程:
public class Foo {
private View myButton;
...
}
我想调用foo.myButton.performClick()。但我无法修改Foo类,因为它是一个库。我该怎么办?
我正在尝试
Field mField= Foo.class.getDeclaredField("myButton");
但我不知道如何从字段中获取视图参考
由于
答案 0 :(得分:2)
用
Field mField = Foo.class.getDeclaredField("myButton")
您将获得该字段规范的参考。其中包含的数据包括访问器,它所拥有的值的类型等。如果要获取视图的引用,则需要执行以下操作:
View viewReference = (View)mField.get(fooInstance);
要访问私有字段(使用下面提到的反射),您需要确保该字段可以访问:
mField.setAccessible(true);
我建议您在获得参考后恢复该标志。根据您所面临的情况,可能会有更好的解决方案。
祝你好运
答案 1 :(得分:1)
无法使用/获取私有字段或方法。这是java规则。您不能继承私有字段/方法。私有方法/字段在其定义的类中受到限制。
答案 2 :(得分:1)
必须有一个更好的答案,而不是闯入实例获取其私人信息。由于某种原因,该信息几乎肯定是私人。
但是,你可以这样做,使用get
这样做(在你的代码获得mField
之后):
mField.setAccessible(true);
View button = (View)mField.get(theFooInstance);
(您需要setAccessible
调用,因为默认情况下无法访问私有字段。)
答案 3 :(得分:1)
在实际获取之前,您可能需要在该字段上将accessible设置为true:
Field field = Foo.getClass().getDeclaredField("myButton"));
field.setAccessible(true);
View button = (View) field.get(fooInstance);
答案 4 :(得分:1)
我认为你可以尝试通过java反射来做到这一点。 smth类似于:
Foo obj = new Foo();
Method method = obj.getClass().getDeclaredMethod( methodName );
method.setAccessible(true);
Object result = method.invoke(obj);