繁体   English   中英

通过反射将值设置为java类?

[英]Set value to java class by reflection?

我有这个模型:

public class Base_RegisterPlack {


    private String RegisterPlackTypeValue;

    public void setRegisterPlackTypeValue(String registerPlackTypeValue) {
        RegisterPlackTypeValue = registerPlackTypeValue;
    }
}

在这个方法中,我传递了这个对象:

gridView2.setAdapter(GridHelper.getRegisterPlackAdapter(getContext(), getCookie(),
        result_getClsBase_Info.getBase_RegisterPlack()), Base_RegisterPlack.class);

setAdapter方法的主体是:

public void setAdapter (DataGridAdapter adapter, Class cls) {
    this.baseClass = cls;
    super.setAdapter(adapter);
    setGridAdapter(adapter);
}

现在我想调用 set 方法setRegisterPlackTypeValue所以我写了这个反射:

try {
    Field field = baseClass.getDeclaredField("RegisterPlackTypeValue");
    field.setAccessible(true);
    field.set(baseClass,"test");
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

我收到此错误:

java.lang.IllegalArgumentException: Expected receiver of type com.module.contracts.Base_RegisterPlack, but got java.lang.Class<com.module.contracts.Base_RegisterPlack>

我如何调用 set 方法并在设置值后再次将此baseClass转换为Base_RegisterPlack

您将需要baseClass表示的类的实例。 如何做到这一点将取决于实际baseClass的设计(即,它是否具有构造函数或静态工厂方法),以及这些需要什么参数。 在最简单的情况下,您的基类将有一个无参数构造函数,您可以简单地执行以下操作:

field.set(baseClass.newInstance(),"test");

但是,您可能希望保留对newInstance返回的任何实例的引用。

重要的是要记住,通过反射, Field类型的实例表示其声明类中的字段声明,而不是对象中的实际字段(实例变量)。 因此,代码中变量field中存储的值与任何实例无关。 这就是为什么当您调用Field.set(target, value)您必须提供类baseClass的对象。 由 field 表示的该对象的field将设置为值"test" 有关详细信息,请参阅本教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM