У меня есть класс, который имеет много атрибутов settable / gettable. Я хотел бы использовать отражение для установки этих атрибутов, но у меня есть 2 вопроса о моей реализации
Вот некоторый урезанный код из моего класса
class Q {
public String question_1;
public String question_2;
public String question_3;
public String answer_1;
public String answer_2;
public String answer_3;
//etc. etc. Many String attributes
// … constructor and other stuff are omitted
// here is my method for "dynamically" setting each attribute
public void set_attribute(String a_raw_string, String my_field) {
try {
Class cls = Class.forName("com.xyz.models.Q");
Field fld = cls.getField(my_field);
fld.set(this, a_raw_string);
}
catch (Throwable e) {
System.err.println(e);
}
}
Затем я устанавливаю следующие поля:
Q q = new Q();
q.set_attribute("abcde", "question_1");
q.set_attribute("defgh", "question_2");
// etc.
Это работает (т.е. переменные экземпляра устанавливаются, когда я вызываю set_attribute.
Однако они работают только тогда, когда переменные экземпляра объявлены как публичные. Когда они объявлены закрытыми, я получаю NoSuchFieldException
ВОПРОС 1: Почему я получаю эту ошибку, когда поля закрыты? Мое наивное предположение состоит в том, что поскольку функция set_attribute является частью класса, она должна иметь беспрепятственный доступ к переменным экземпляра.
ВОПРОС 2: Я думаю, что, возможно, переосмысливаю эту проблему (то есть, я не должен использовать отражение для установки переменных таким образом). Есть ли более рекомендуемый подход?
Причина, по которой я хочу использовать рефлексию, заключается в том, что в заднице больно объявлять массу методов сеттера ... поэтому мне интересно, решил ли кто-то эту досаду лучше.
Спасибо!