Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Про рефлексию вопрос / 25 сообщений из 56, страница 1 из 3
25.08.2014, 08:35
    #38727769
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
есть класс
в нем
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
private final Pattern command = Pattern.compile("(?s)^(.*)\\|(.*)");
....
public void onMessage(String data) {
        Matcher matcher = command.matcher(data);
        matcher.find();

        String par = (matcher.group(2).length() == 0) ? "" : matcher.group(2);
        Class[] paramTypes = new Class[]{java.lang.String.class};
        Object[] args = new Object[]{par};

        try {
            Method method = this.getClass().getMethod(matcher.group(1), paramTypes);
            method.invoke(this, args);
        } catch (NoSuchMethodException | SecurityException ex) {
......
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
.......
        }
    }


это лучше, чем городить if или switch, т.к. вызываемых методов прилично.
количество вызываемых методов растёт, есть желание разделить их на логические группы, а эти группы поместить в разные файлы
но как это можно реализовать?
...
Рейтинг: 0 / 0
25.08.2014, 09:21
    #38727787
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадяэто лучше, чем городить if или switch, т.к. вызываемых методов прилично.

Зато типобезопасность идёт лесом. Лучше было использовать полиморфизм. На худой конец - HashMap. Тем более с лямбдами сейчас это очень просто.
...
Рейтинг: 0 / 0
25.08.2014, 09:37
    #38727804
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
Blazkowiczвадяэто лучше, чем городить if или switch, т.к. вызываемых методов прилично.

Зато типобезопасность идёт лесом. Лучше было использовать полиморфизм. На худой конец - HashMap. Тем более с лямбдами сейчас это очень просто.

соглашусь, но сейчас вопрос не об этом.
а как разнести методы по разным файлам (классам?)
...
Рейтинг: 0 / 0
25.08.2014, 09:40
    #38727808
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадяа как разнести методы по разным файлам (классам?)
Ctrl+X, Ctrl+V
...
Рейтинг: 0 / 0
25.08.2014, 09:54
    #38727824
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
Blazkowicz,
шутник,
как вызывать из одного класса - методы из разных классов?
...
Рейтинг: 0 / 0
25.08.2014, 10:02
    #38727832
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадяшутник,

Какой вопрос, такой и ответ.

вадякак вызывать из одного класса - методы из разных классов?
Вероятно, вместо this.getClass() нужно использовать ссылку на класс, в котором находится метода.
...
Рейтинг: 0 / 0
25.08.2014, 10:41
    #38727868
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадя,
Я вот теряюсь в догадках, Вы что эмулируете, JMS или RPC?

Колеса уж очень квадратные....

Кто вызывает вот этот метод onMessage?
...
Рейтинг: 0 / 0
25.08.2014, 10:42
    #38727870
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
делаю
Код: java
1.
2.
3.
Class cl=com.Myclass.class; 
Method method = cl.getMethod(matcher.group(1), paramTypes);
method.invoke(cl, args);


на последней строке выдаёт
java.lang.IllegalArgumentException: object is not an instance of declaring class
...
Рейтинг: 0 / 0
25.08.2014, 10:44
    #38727871
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
HoBTID, это вызывает WebSocketServer.
...
Рейтинг: 0 / 0
25.08.2014, 10:45
    #38727872
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадяделаю
Код: java
1.
2.
3.
Class cl=com.Myclass.class; 
Method method = cl.getMethod(matcher.group(1), paramTypes);
method.invoke(cl, args);


на последней строке выдаёт
java.lang.IllegalArgumentException: object is not an instance of declaring class

В этой строке:

method.invoke(cl, args);

1-й параметр должен быть объектом, а не классом.
...
Рейтинг: 0 / 0
25.08.2014, 11:20
    #38727912
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
сделал так
Код: java
1.
2.
3.
4.
Class cl = com.Myclass.class;
Object objCl = cl.newInstance();
Method method = cl.getMethod(matcher.group(1), paramTypes);
method.invoke(objCl, args);


работает.
но смущает вот это
Object objCl = cl.newInstance();
насколько затратная операция?
зачем её делать многократно, можно ли (будет ли быстрее) как-то вставить её в Singleton?
...
Рейтинг: 0 / 0
25.08.2014, 11:32
    #38727933
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадянасколько затратная операция?

В переиспользовании экземпляров нужно соблюдать баланс между количеством долгоживущих объектов, которые влияют на производительность GC и затратами на создание новых экземпляров. У вас высоконагруженая обработка сообщений?
Если проект взлетит, то потомки вас будут проклинать за рефлексию.
...
Рейтинг: 0 / 0
25.08.2014, 11:33
    #38727935
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадячем городить if или switch
если "городить" - это всё, что не нравится. То напиши через if или switch
...
Рейтинг: 0 / 0
25.08.2014, 11:35
    #38727937
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадя,
ООП в разруливании сообщений не нужен. IMHO
...
Рейтинг: 0 / 0
25.08.2014, 13:19
    #38728038
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
Petro123вадячем городить if или switch
если "городить" - это всё, что не нравится. То напиши через if или switch
если цепочка из 100 if - номально, то....
да и добавлять нужно будет и в if и метод, так я добавляю только метод.

авторЕсли проект взлетит, то потомки вас будут проклинать за рефлексию.
чем рефлексия тормознута?
и чем её можно заменить?
методов для выполнения ожидается много.
if и switch при >100 методов будет тоже не быстро.
...
Рейтинг: 0 / 0
25.08.2014, 13:23
    #38728042
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадя,
> 100 if

бест-практик.
Я задавал этот вопрос у чела из MS.
Он сказа что в самой MS портянки на события очень большие.
Это не БЛ, а переключатели. Это нормально.
Удачи!
PS. Можно разделить обработчики на 4 простыни из категорий событий.
...
Рейтинг: 0 / 0
25.08.2014, 13:32
    #38728050
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
if и switch работают последовательным проходом и сравнением
как работает рефлексия?
...
Рейтинг: 0 / 0
25.08.2014, 13:34
    #38728055
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
Напрашивается паттерн "команда" + хеш-таблица.
А с рефлексией, кроме всего прочего, есть еще и вопросы безопасности. Например, если указанный метод предназначен для работы в web, то с клиента могут прийти не только разрешенные команды, а и вообще вызов любого публичного метода.
...
Рейтинг: 0 / 0
25.08.2014, 13:41
    #38728065
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
авторНапрашивается паттерн "команда" + хеш-таблица.
более подробно можно?
если про web - то я могу занести все разрешенные методы в array (к примеру) и вызывать только их.
...
Рейтинг: 0 / 0
25.08.2014, 14:05
    #38728089
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадязанести все разрешенные методы в array (к примеру) и вызывать только их.
они уже там есть при рефлексии
...
Рейтинг: 0 / 0
25.08.2014, 14:51
    #38728144
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадяавторНапрашивается паттерн "команда" + хеш-таблица.
более подробно можно?
если про web - то я могу занести все разрешенные методы в array (к примеру) и вызывать только их.
1) во-первых, 100 методов - декомпозиция неизбежна. Паттерн "команда" предлагает безкомпромиссную декомпозицию - на каждую команду создается отдельный класс. Для этого описываем интерфейс примерно такого вида:
Код: java
1.
2.
3.
public interface ICommand {
	public void execute(String param);
}


и создаем 100 простейших классов, реализующих этот интерфейс. Необходимо добавить новую команду - просто добавляем новый класс, не торгая всё остальное
2) в методе onMessage пролучив на входе символьную команду, надо как-то получить соответствующий ей объект и выполнить метод execute() этого объекта.
Тут все зависит от прочих условий
- Например, можно заранее создать таблицу и при старте поместить в нее сконструированные объекты Map<String,ICommand>. На момент выполнения вызываем
Код: java
1.
commandMap.get(command).execute(param)


- Если есть проблемы с памятью, то можно поместить в таблицу классы Map<String,Class<ICommand>> и создавать объект только на время выполнения команды:
Код: java
1.
commandMap.get(command).newInstance().execute(param)


- можно использовать готовый механизм работы с бинами, например, спринг

начальное заполнение таблицы - тоже много вариантов.
- забить всё в коде
- сканировать определенные пакеты
- использовать ресурс с именами классов
- и т.д.
Если хотим избежать жесткого кодирования, то почти во всех вариантах будет использована рефлексия, хотя и достаточно "ленивая"
...
Рейтинг: 0 / 0
25.08.2014, 15:01
    #38728157
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
ivanra,
не для флейма, а как контраргумент. Т.к. if или ООП шансы равнозначны.
- 100 классов это не меньше 100 if константа
- шаблон комманда часто применяют в ГУИ напр. на Меню, а не в системных библиотеках.
Решать аффтару.
Удачи!
...
Рейтинг: 0 / 0
25.08.2014, 15:45
    #38728220
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
вадячем рефлексия тормознута?

Нет, дело не в производительности.
Тут в соседней теме хорошее видео. Там в начале про рефлексию есть.
16488677

вадяи чем её можно заменить?
методов для выполнения ожидается много.

Любым прямым диспатчем, через Map+Callable, через полиморфизм. Можно таки внятно объяснить, зачем все методы в одном классе?

вадяif и switch при >100 методов будет тоже не быстро.

А при параллельных иерархиях будет убийственно для поддержки.
...
Рейтинг: 0 / 0
25.08.2014, 17:10
    #38728327
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
Учитывая что this.getClass().getMethod(...) имеет ограниченную спецификацию методов
или количество методов счётно то совершенно нет смысла городить общую (generic)
постановку при которой нам "что угодоно" приходит в data и мы с ним делаем "что нибудь".
...
Рейтинг: 0 / 0
25.08.2014, 19:11
    #38728451
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про рефлексию вопрос
из просмотренного и прочитанного можно сделать вывод -
рефлексия не очень медленный процесс, и в большинстве случаев, потерю быстродействия не поймать.
рефлексия не безопасна, если использовать в лоб, можно нарваться, но если кто-то захочет что-то взломать - вопрос в цене на защиту от взлома и цене данных...(в моём случае достаточно все методы загнать в массив + вся проверка в пару строк)
следующий вопрос - цена разработки и сопровождения
в применении к своему случаю - у меня есть метод onMessage, я его написал, отладил, и забыл про него.
дальше только добавляю методы для обработки собщений, обработка простая максимум 40 строк(подготовка и обращение к базе , try/catch + немного логики).
при этом повторяющиеся куски кода можно вынести в отдельный метод. расположив его неподалёку от места где вызывается.
получается наглядно и просто.

но когда число методов вырастает - рыскать по такому количествунесколько мутноватно.
автор Паттерн "команда" предлагает безкомпромиссную декомпозицию - на каждую команду создается отдельный класс.
т.е. получеатся 100+ файлов?
компиляция многих файлов - больше времени, чем одного большого (на время разработки существенно)
да и искаить что-то в файлах затрвтнее, чем в одном файле.

if/switch - тоже не есть хорошо - (т.е. хорошо когда получаешь за строки ) -нужно написать метод, да не зfбыть добавить его в листинг if/switch
и сколько времени потребуется для прохождения и сравнения всех 100+ строковых данных....

авторМожно таки внятно объяснить, зачем все методы в одном классе?
для начала из простоты, пока их 15 проблем нет, удобно , наглядно.
вот и встал вопрос сгруппировать в разные файлы(я не говорю классы, хотя придется группировать в классы).
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Про рефлексию вопрос / 25 сообщений из 56, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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