У меня есть класс, который имеет много атрибутов settable/gettable. Я бы хотел использовать reflection для установки этих атрибутов, но у меня есть 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: я думаю, что, возможно, слишком много думаю об этой проблеме (т. е. мне не следует использовать отражение для установки переменных таким образом). Есть ли более рекомендуемый подход? Причина, по которой я хочу использовать отражение, заключается в том, что объявить кучу сеттер-методов — головная боль в заднице… поэтому мне интересно, решил ли кто-нибудь эту проблему лучше.
Спасибо!