Универсальный прозрачный конвертер

в 5:47, , рубрики: java, метки:

Появилась потребность в создании прозрачного конвертера сложных объектов однотипных по структуре, но различающихся по namespace'у. Изначально имеется два XSD с описанием разных типов. JAXB их отлично обрабатывает и создаёт стабы. Далее по бизнес-логике нужно производить преобразование объекта из одного namespace'а в другой. Когда типов объектов не много, то не сильно утомительно сделать индивидуальный конвертер, но по мере разрастания структуры данных, такой подход уже не эффективен. Поэтому возникла идея написать один универсальный конвертер с прозрачным переносом данных.

Хочется сделать так, чтобы вызов конвертера в программном коде выглядел как нибудь так:

MyObjectA _a = new MyObjectA();
...
MyObjectB _b = Transparent.convert(_a);

За десять минут накидал скелет метода:

public class Transparent {

    public static <A, B> A convert(B x) {
        A res = null;
        for (Method m : x.getClass().getMethods()) {    // Читаем все методы полученного объекта из входного параметра
            String _methodName = m.getName();           // Запоминаем название метода
            if (_methodName.startsWith("get")) {        // Если это getter, то проходим дальше
                String _fieldName = _methodName.substring(3);            // Отрезаем 'get' и запоминаем название поля
                Class[] _paramTypes = new Class[]{m.getReturnType()};    // Запоминаем тип возвращаемого объекта этого метода
                try {
                    Method _methodName2 = res.getClass().getMethod("set".concat(_fieldName ), _paramTypes);
         // Пытаемся найти setter-метод с требуемой сигнатурой в требуемом возвращаемом типе
         // Дальше логика следующая - если setter-метод найден, то с помощью рефлексии получаем значение параметра из входного объекта, и присваиваем это значение возвращаемому объекту "res".
                } catch (NoSuchMethodException ex) {
                    Logger.getLogger(Transparent.class.getName()).log(Level.SEVERE, null, ex);
                    continue;
                } catch (SecurityException ex) {
                    Logger.getLogger(Transparent.class.getName()).log(Level.SEVERE, null, ex);
                    continue;
                }
            }
        }
        return res;
    }
}

Всё бы хорошо, но споткнулся на строке "_methodName2 = res.getClass().getMethod(«s...», объект «res» не инициирован, и это логично, ибо «A res = null;».

Собственно вопрос к гуру Java — как можно инициировать объект res в таком статическом методе?

Автор: Mar4elo

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js