我有这个模特:
def get_channels(access_token):
url = Oauth.discord_api_url + "/users/@me/channels"
headers = {
"Authorization": "Bearer {}".format(access_token)
}
channels_obj = requests.get(url = url, headers = headers)
channels_json = channels_obj.json()
return channels_json
在这种方法中,我传递了这个对象:
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);
}
,所以我写了以下反映:
setRegisterPlackTypeValue
我收到此错误:
try {
Field field = baseClass.getDeclaredField("RegisterPlackTypeValue");
field.setAccessible(true);
field.set(baseClass,"test");
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
如何调用set方法并将其设置为java.lang.IllegalArgumentException: Expected receiver of type com.module.contracts.Base_RegisterPlack, but got java.lang.Class<com.module.contracts.Base_RegisterPlack>
后再次转换为baseClass
?
答案 0 :(得分:1)
您将需要一个baseClass
代表的类的实例。具体如何执行操作将取决于实际baseClass
的设计(即,它是否具有构造函数或静态工厂方法),以及这些参数需要哪些参数。在最简单的情况下,您的基类将具有无参数的构造函数,您只需执行以下操作即可:
field.set(baseClass.newInstance(),"test");
但是,您可能希望保留对newInstance
返回的任何实例的引用。
重要的是要记住,通过反射,类型Field
的实例在其声明类中表示 field声明,而不是对象中的实际字段(实例变量)。因此,存储在代码中的变量field
中的值与任何实例都不相关。这就是为什么在调用Field.set(target, value)
时必须提供类baseClass
的对象的原因。该对象的字段(由field
表示)将设置为值"test"
。有关详细信息,请参见this tutorial。