Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Красивое решение вместо рефлексии / 13 сообщений из 13, страница 1 из 1
25.09.2013, 01:07:31
    #38406684
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
Есть такой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    @Autowired
    private Call call;

    public Map<String, Object> mapInfo() {
        Map<String, Object> map = new HashMap<String, Object>();
        Class noparams[] = {};

        Class refClass = call.getClass();
        Method[] cMetods = refClass.getInterfaces()[0].getMethods();

        try {
            for(Method cMetod : cMetods) {
                Method method = refClass.getDeclaredMethod(cMetod.getName(), noparams);
                map.put(cMetod.getName(), method.invoke(call, null ));
            };
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return map;
    }


Надо убрать рефлексию. Понятное дело, что Call это интерфейс. Мне надо вызвать все методы которые имплементирует подставленный класс. Вот интерфейс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public interface Call {
    public String service();
    public String serviceXL();
    public String phoneNumber();
    public String language();
    public String languageXL();
    public String serviceDate() throws ParseException;
    public String serviceTime() throws ParseException;
    public String serviceTimeXLstart() throws ParseException;
    public String serviceTimeXLend() throws ParseException;
    public List<String> callList();
}


Вопрос просто тупо вызвать все методы или есть еще варианты?
...
Рейтинг: 0 / 0
25.09.2013, 13:31:47
    #38407145
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
ErikI,

Да, тупо вызывать все методы, а в чём дело-то ?

Чем не нравится?
Чем не нравится решение с Reflection ?

Они правда разные будут, по Reflection ты все методы будешь всегда вызывать (все без параметров),
а руками -- только указанные.
...
Рейтинг: 0 / 0
25.09.2013, 13:33:41
    #38407149
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
ErikI,

У тебя кстати некоторые методы имеют другие сигнатуры.

А так можно было бы объявить один интерфейс с одним методом и сделать много реализаций, положить их в массив или коллекцию, и в цикле вызывать.
...
Рейтинг: 0 / 0
25.09.2013, 13:43:37
    #38407172
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
MasterZivА так можно было бы объявить один интерфейс с одним методом и сделать много реализаций, положить их в массив или коллекцию, и в цикле вызывать.
В Java 8 есть какие-никакие ссылки на методы. Возможно их будет проще складироват в Map.
...
Рейтинг: 0 / 0
25.09.2013, 14:15:52
    #38407227
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
Если тебя пугает то, что ты в твоем классе, который реализует этот интерфейс, будет много пустых ненужных методов, но которые как бы надо "реализовать" у себя, то попробуй паттерн Адаптер. В двух словах, он делает так, чтобы лишние методы перед глазами не маячили. И в твоем классе будет будут те методы, которые действительно надо реализовать.
...
Рейтинг: 0 / 0
25.09.2013, 14:20:00
    #38407235
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
Так как все методы выглядят как акцессоры, то есть смысл их привести к именованию JavaBeans и получать значения через Introspector или Apache Commons Bean Utils. Та же рефлексия, но, возможно, более лаконичный код.
...
Рейтинг: 0 / 0
25.09.2013, 17:15:59
    #38407570
ErikI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
Спасибо за советы. Буду думать над предложенными вариантами.
...
Рейтинг: 0 / 0
25.09.2013, 17:23:39
    #38407583
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
ErikIСпасибо за советы. Буду думать над предложенными вариантами.
Я бы делал через BeanUtils.
...
Рейтинг: 0 / 0
25.09.2013, 18:14:04
    #38407630
Мужик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
Маловато условий для решения. Кроме предложенных есть еще варианты статической и динамической кодогенерации.
...
Рейтинг: 0 / 0
26.09.2013, 20:40:36
    #38408985
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
ErikIСпасибо за советы. Буду думать над предложенными вариантами.

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

Java -- это грёбаный кроссплатформенный объектноориентированный Бейсик.
Написал -- и забыл.
...
Рейтинг: 0 / 0
26.09.2013, 20:45:27
    #38408991
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
MasterZivВот за чё мне нравятся Java программисты, так это что они над каждой хернёй думают.
Тут не думать, тут делать надо.
Java -- это грёбаный кроссплатформенный объектноориентированный Бейсик.
Написал -- и забыл.
Клац-клац и в продакшн. Да?
...
Рейтинг: 0 / 0
26.09.2013, 21:45:23
    #38409031
rfq
rfq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
MasterZivТут не думать, тут делать надо.

Это никак цитата из какого-то анекдота?
MasterZivJava -- это грёбаный кроссплатформенный объектноориентированный Бейсик.
Написал -- и забыл.
Если писать не думая, то забыть не дадут благодарные пользователи.
...
Рейтинг: 0 / 0
27.09.2013, 08:39:22
    #38409224
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Красивое решение вместо рефлексии
rfq,
ну, он преувеличил)).
Но в java действительно, очень много усложняют на пустом месте.
Рефлексия (RTTI Delphi) нужна в очень ограниченном числе случаев
Код: plaintext
1.
2.
3.
4.
5.
6.
 Определить класс объекта. 
    Получить информацию о модификаторах класса, полях, методах, конструкторах и суперклассах.
    Выяснить, какие константы и методы принадлежат интерфейсу. 
    Создать экземпляр класса, имя которого неизвестно до момента выполнения программы.
    Получить и установить значение свойства объекта.
    Вызвать метод объекта.
    Создать новый массив, размер и тип компонентов которого неизвестны до момента выполнения программ.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Красивое решение вместо рефлексии / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]