在Android / java中调用类的私有对象的方法

时间:2014-03-19 09:38:46

标签: java android reflection

我有以下课程:

public class Foo {
    private View myButton;
    ...
}

我想调用foo.myButton.performClick()。但我无法修改Foo类,因为它是一个库。我该怎么办?

我正在尝试

Field mField= Foo.class.getDeclaredField("myButton");

但我不知道如何从字段中获取视图参考

由于

5 个答案:

答案 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);