我有这样的配置文件:
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)如果我的叶子可以是原始的和非原始的吗?
答案 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);
}
另外,我建议:
答案 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);