我需要根据仅保存更改的映射更新几个POJO字段。
例如(松散编码):
Class MyClass{
public MyClass(a,b,c);
private int a;
private int b;
private int c;
}
int main(){
Map<String, String> keyValueMap = new HashMap<>();
MyClass obj = new MyClass(1,2,3);
keyValueMap.put("c", 6);
keyValueMap.put("b", 4);
//Update only b and c values of obj:
updateObj(obj, keyValueMap);
keyValueMap.put("a", 5);
keyValueMap.put("b", 7);
//Update only a and b values of obj:
updateObj(obj, keyValueMap);
}
void updateObj(MyClass obj, Map<String, String> keyValueMap){
for (Map.Entry<String,String> entry : keyValueMap.entrySet())
if(entry.getKey().equals("a")
obj.setA(entry.getValue();
if(entry.getKey().equals("b")
obj.setB(entry.getValue();
if(entry.getKey().equals("c")
obj.setC(entry.getValue();
}
}
除了完整的if链之外,还有没有更好的方法来实现updateObj()?
谢谢大家。
您可以这样做,这里我只显示一个字段,其他字段也可以显示。
更新a
值
1。找到要更新的字段a
2。然后找到变种器
3。对具有新值的对象执行增变器:
Class<?> myObjectClassHandle = Class.forName(MyClass);
Object myObject = myObjectClassHandle.newInstance();
Field field=myObjectClassHandle.getDeclaredField("a");
Method setter=myObjectClassHandle.getMethod("seta", field.getType());
setter.invoke(myObject , keyValueMap.get("a));
示例代码(更新方法):
static void updateObj(MyClass obj, Map<String, Integer> keyValueMap) {
try {
Field declaredField = null;
for(String key:keyValueMap.keySet()) {
declaredField = MyClass.class.getDeclaredField(key);
boolean accessible = declaredField.isAccessible();
declaredField.setAccessible(true);
declaredField.set(obj, keyValueMap.get(key));
}
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}