【问题标题】:Java: How to update some of POJO fields according to a given map of values?Java:如何根据给定的值映射更新一些 POJO 字段?
【发布时间】:2020-05-05 06:53:27
【问题描述】:

我需要根据只包含更改的地图更新几个 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()?

谢谢大家。

【问题讨论】:

  • 也许反射 API 可以帮助您解决这个问题? stackoverflow.com/questions/24094871/…
  • 是的,反思。
  • 谢谢各位,能提供一个例子吗?
  • 反射是你所需要的。愿你觉得这篇文章有用吗:crunchify.com/…,就像我一样。
  • @dushkin 下面的文章提供了一组示例

标签: java


【解决方案1】:

你可以使用Java反射来做你想做的事:

static void updateObj(Main obj, Map<String, Integer> keyValueMap){
    try {
        for (Map.Entry<String,Integer> entry : keyValueMap.entrySet()) {
            Field field = Main.class.getField(entry.getKey());
            field.setAccessible(true)
            field.set(obj,entry.getValue());
        }
    } catch(Exception e) {}
}

【讨论】:

  • 户田伊塔马尔。我使用 getDeclaredField() 而不是 getField() 来充分利用您的解决方案。
【解决方案2】:

示例代码(更新方法):

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));
                declaredField.setAccessible(accessible);
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }

    }

【讨论】:

    【解决方案3】:

    您可以简单地使用反射 API。 这是基于您的代码的示例:

    public class Main1 {
        public static void main(String[] args) {
            Map<String, String> keyValueMap = new HashMap<>();
    
            MyClass obj = new MyClass(1,2,3);
            keyValueMap.put("c", "6");
            keyValueMap.put("b", "4");
    
            System.out.println(obj);
    
            //Update only b and c values of obj:
            updateObj(obj, keyValueMap);
    
            System.out.println(obj);
    
            keyValueMap.put("a", "5");
            keyValueMap.put("b", "7");
    
            //Update only a and b values of obj:
            updateObj(obj, keyValueMap);
    
            System.out.println(obj);
        }
    
        private static void updateObj(MyClass myClass, Map<String, String> map) {
            Class<MyClass> clazz = MyClass.class;
            for (String fieldName: map.keySet()) {
                try {
                    Field field = clazz.getDeclaredField(fieldName);
                    field.setAccessible(true);
                    field.set(myClass, Integer.parseInt(map.get(fieldName)));
                } catch (NoSuchFieldException ex) {
                    System.out.println("No Such Field Found!!!");
                } catch (IllegalAccessException ex) {
                    System.out.println(ex);
                }
            }
        }
    }
    
    class MyClass {
        private int a;
        private int b;
        private int c;
    
        public MyClass(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    
        @Override
        public String toString() {
            return "MyClass{" + "a=" + a + ", b=" + b + ", c=" + c + '}';
        }
    }
    

    注意:不要忘记将field.setAccessible(true); 用于私人会员;否则你会得到一个 IllegalAccessException。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多