...

вторник, 3 сентября 2013 г.

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


сегодня в 09:47


Появилась потребность в создании прозрачного конвертера сложных объектов однотипных по структуре, но различающихся по 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 в таком статическом методе?





Developers, stick with Russians – work in London




Переводы с

карты на карту


Переводы

через QR-Код


Новая функция

«Мой контроль»




Возьми Lumia 925 на тест-драйв сейчас.




Впечатляющие возможности

в стильном тонком корпусе из металла




Boomburum

исследует LTE


Эволюция средств связи

в путешествии по России



Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий