Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Многофункциональный прозрачный конвертер

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

Варианты «new A()», «A.class», «A.getClass().newInstance()» не рабочие.

Добавочно пробовал вот такой вариант:

    private class _init<A> {

        private Class<A> type;

        public <A> A get(A c) {
            A ret = null;
            try {
                ret = (A) type.newInstance();
            } catch (InstantiationException ex) {
                Logger.getLogger(Converter.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(Converter.class.getName()).log(Level.SEVERE, null, ex);
            }
            return ret;
        }
    }

Инициализацию соответственно провести как «A res = (new _init()).newInstance()», но данный вариант тоже не проходит, так как не возможен в static-контексте.

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB