Мне кажется, эта задача решается посредством рефлексии.
Пусть есть два класса: 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-ом, но вас, кажется, интересует именно то, как можно в таких методах работать с объектами и их полями, что я и постарался отразить.