Java:如何根据给定的值映射更新一些POJO字段?

问题描述 投票:0回答:2

我需要根据仅保存更改的映射更新几个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()?

谢谢大家。

java
2个回答
0
投票

您可以这样做,这里我只显示一个字段,其他字段也可以显示。

更新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));

0
投票

示例代码(更新方法):

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();
        }

    }
© www.soinside.com 2019 - 2024. All rights reserved.