我得到了一个类(我不能修改),它有很多String字段,每个字段都有一个set方法。
public class C {
private String fieldA,
private String fieldB,
...
public void setFieldA(String s) {
this.fieldA = s;
}
public void setFieldB(String s) {
this.fieldB = s;
}
...
}我需要编写代码来创建类的实例,并使用json对象对其进行初始化(该对象将具有某些或所有字段的值)。
json非常简单,看起来像这样:
{"fieldA":"valueA",“fieldB”:“valueB”.}
我知道我可以为每个字段编写类似下面的内容:
if (myJsonObj.containsKey("fieldA"){
myInstance.setFieldA(myJsonObj.get("fieldA").toString());
}我想知道是否有更聪明的方法可以做到这一点,因为字段的数量可能高达30个左右。而不是重复上面的代码30次(每个代码之间唯一不同的是上面代码中的"fieldA“)。
谢谢!
发布于 2021-07-09 03:24:55
感谢Chris Parker。这是我的最终代码,基于他的原始代码。因为该类中有许多String字段,而且将来可能会更改,所以使用reflect可以非常容易地进行更新/更改:我只需要更改String Array。
给定的类如下所示(仅显示字符串字段及其set方法):
public class MyClass {
private String fieldA,
private String fieldB,
...
public void setFieldA(String s) {
this.fieldA = s;
}
public void setFieldB(String s) {
this.fieldB = s;
}
...
}使用JSONObject输入将这些字符串字段的值设置到C:
public void fillClassStringFields(MyClass c, JSONObject input) {
String[] names = {"FieldA","FieldB",...};
Class<MyClass> clazz = MyClass.class;
Class<?>[] types = {String.class};
for(int i = 0; i< names.length;i++) {
String name = names[i].toString();
String methodName = "set" + name;
if(input.containsKey(name)) {
try {
Method method = clazz.getDeclaredMethod(methodName, types);
method.invoke(c, input.get(name).toString());
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}https://stackoverflow.com/questions/68183060
复制相似问题