Java: Как обновить некоторые поля POJO в соответствии с заданной картой значений? - PullRequest
0 голосов
/ 05 мая 2020
• 1000 () кроме полной цепочки if?

Всем спасибо.

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Вы можете использовать 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) {}
}
0 голосов
/ 05 мая 2020

Вы можете просто использовать Reflection 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.

0 голосов
/ 05 мая 2020

Пример кода (метод обновления):

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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...