![](/img/trans.png)
[英]Java - Reflection. Set value for the class object which are dynamically created
[英]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.