如何使用java反射填充复合对象?

时间:2014-12-22 12:25:37

标签: java class reflection field getter-setter

我有这样的配置文件:

Provider Search,ConfigURL,http://myUrl

我想使用反射

填充此对象
public class MyPrefrences {

    public ProviderSearch ProviderSearch;
}



    public class ProviderSearch {

        public String ConfigURL;

    }

这是我的代码,但是我无法设置复合对象:

    MyPrefrences myPrefrences = new MyPrefrences();

    try {
        Field field = myPrefrences.getClass().getDeclaredField(normalizedCategory);
        Field field2 = field.getClass().getDeclaredField(normalizedKey);
        field2.set(field, val);
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }

你会怎么做

a)如果所有叶子成员都是String?

b)如果我的叶子可以是原始的和非原始的吗?

2 个答案:

答案 0 :(得分:0)

在myPreference的实例中,providerSearch不能为null。

MyPrefrences myPrefrences = new MyPrefrences();

try {
    Field field = MyPrefrences.class.getDeclaredField("ProviderSearch");
    Field field2 = ProviderSearch.class.getDeclaredField("ConfigURL");

    field2.set(field.get(myPrefrences), val);
} catch (Exception ex) {
    throw new RuntimeException(ex);
}

另外,我建议:

  • 不要使用公共领域。
  • 使用以小写字母开头的变量。
  • 使用getter和setter。

答案 1 :(得分:0)

首先,您需要传递您想要在field.set()中设置的对象引用。

第二个:field.getClass()为您提供java.lang.reflect.Field,使用field.getType()来获取您需要的类。 所以,应该是这样的

Field field1=myPref.getClass().getDeclaredField("ProviderSearch");
Object obj=field1.getType().newInstance();
Field field2=field1.getType().getDeclaredField("ConfigURL");
field2.set(obj, "www.stackoverflow.com");
field1.set(myPref, obj);