Установить значение для класса Java с помощью отражения? - PullRequest
1 голос
/ 16 июня 2019

У меня есть эта модель:

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 после установки значения для него?

1 Ответ

1 голос
/ 16 июня 2019

Вам понадобится экземпляр класса, который представляет baseClass.Как именно это сделать, будет зависеть от конструкции фактического baseClass (т. Е. От того, есть ли у него конструкторы или статические фабричные методы) и от того, какие аргументы им нужны.В простейшем случае ваш базовый класс будет иметь конструктор без параметров, и вы можете просто сделать:

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

Однако вы, вероятно, захотите сохранить ссылку на любой экземпляр, возвращаемый newInstance.

Важно помнить, что при отражении экземпляр типа Field представляет объявление поля в своем объявленном классе, а не фактическое поле (переменную экземпляра) в объекте.Таким образом, значение, хранящееся в переменной field в вашем коде, не связано ни с одним экземпляром.Вот почему, когда вы звоните Field.set(target, value), вы должны предоставить объект класса baseClass.Поле этого объекта, которое представлено field, будет установлено в значение "test".Подробнее см. в этом руководстве .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...