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

时间:2019-06-16 13:35:52

标签: java android reflection

我有这个模特:

    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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题