Как создать метод, который будет помещать в класс-сущность данные?

Рейтинг: 1Ответов: 1Опубликовано: 22.03.2023

Нужно создать метод с возвращаемым значением pojo класса, и, с двумя параметрами. Метод будет вызывать сеттеры этого pojo класса и помещать туда значения со строки.

public Pojo fromJson(String json, Pojo cl){
    
    
    return pojo;
}

Ответы

▲ 1Принят

Мне кажется, эта задача решается посредством рефлексии.

Пусть есть два класса: FirstPojo и SecondPojo. У них есть поле name типа String и поле age типа int.
Также в них есть конструкторы. Один принимает на вход параметры для установки их полям, а второй является конструктором по умолчанию.

Приведём пример, как при помощи рефлексии можно вызвать конструктор, передать туда параметры и получить таким образом полноценный готовый объект.

public static <T> T getPojoByConstructor(String data, Class<T> pojoClass) throws Exception {

    String[] parts = data.split(";");

    String name = parts[0];
    int age = Integer.parseInt(parts[1]);

    Constructor<T> constructor = pojoClass.getDeclaredConstructor(String.class, int.class);
    T pojo = constructor.newInstance(name, age);

    return pojo;
}

А теперь покажем, как можно через рефлексию устанавливать значение непосредственно полям. В каком-то смысле он немного гибче, так как мы можем определять поля по названиям, а названия в моём примере заданы в исходной передаваемой строке.
С другой стороны, с final-полями при таком подходе возникнут проблемы, но всё-таки пример есть пример.

public static <T> T getPojoByFields(String data, Class<T> pojoClass) throws Exception {

    String[] parts = data.split(";");

    String fieldName1 = parts[0].substring(0, parts[0].indexOf(":"));
    String name = parts[0].substring(parts[0].indexOf(":") + 1);
    String fieldName2 = parts[1].substring(0, parts[1].indexOf(":"));
    int age = Integer.parseInt(parts[1].substring(parts[1].indexOf(":") + 1));

    Constructor<T> constructor = pojoClass.getDeclaredConstructor();
    T pojo = constructor.newInstance();

    Field field1 = pojoClass.getDeclaredField(fieldName1);
    field1.setAccessible(true);
    field1.set(pojo, name);

    Field field2 = pojoClass.getDeclaredField(fieldName2);
    field2.setAccessible(true);
    field2.set(pojo, age);

    return pojo;
}

Метод, в котором тестируем:

public static void main(String[] args) throws Exception {

    FirstPojo firstPojo = getPojoByConstructor("Petya;35", FirstPojo.class);
    SecondPojo secondPojo = getPojoByConstructor("Vasya;24", SecondPojo.class);
    System.out.println(firstPojo);
    System.out.println(secondPojo);

    FirstPojo firstPojo2 = getPojoByFields("name:Ivan;age:15", FirstPojo.class);
    SecondPojo secondPojo2 = getPojoByFields("name:Dima;age:76", SecondPojo.class);
    System.out.println(firstPojo2);
    System.out.println(secondPojo2);
}

Результат:

FirstPojo{name='Petya', age=35}
SecondPojo{name='Vasya', age=24}
FirstPojo{name='Ivan', age=15}
SecondPojo{name='Dima', age=76}

Понятно, что это сильно упрощённые примеры, да и здесь нету работы с json-ом, но вас, кажется, интересует именно то, как можно в таких методах работать с объектами и их полями, что я и постарался отразить.