我有一个类,其中包含许多可设置/可获取的属性。 我想使用反射来设置这些属性,但是我对我的实现有两个问题。
以下是我类中剥离出来的一些代码:
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:我认为可能过度思考了这个问题(即我不应该使用反射以这种方式设置变量)。是否有更推荐的方法?我想使用反射的原因是声明大量setter方法很麻烦...所以我想知道是否有人已经找到了更好的解决办法。
谢谢!