Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / methods / 25 сообщений из 42, страница 1 из 2
07.09.2006, 08:21:12
    #33969675
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
Есть интерфейс в котором за 50 методов
Есть метод в котором нужно в зависимости он заданной строки выбрать какой из методов того интерфейса нужно запустить
Есть ли более изящное(простое) решение чем использование рефлекшена?
...
Рейтинг: 0 / 0
07.09.2006, 10:23:17
    #33969914
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
А что сложного в reflection?
...
Рейтинг: 0 / 0
07.09.2006, 10:36:17
    #33969970
Евгений Путилин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
LINUXERЕсть интерфейс в котором за 50 методов
Есть метод в котором нужно в зависимости он заданной строки выбрать какой из методов того интерфейса нужно запустить
Есть ли более изящное(простое) решение чем использование рефлекшена?
if ... else if ...
НУ остальное уже извращения можно например используя ClassLoader переписывая байт код загружать класс которы будет звать нужный метод.
...
Рейтинг: 0 / 0
07.09.2006, 10:37:26
    #33969972
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
if () {
} else if () {
} else if () {
...
...
Рейтинг: 0 / 0
07.09.2006, 10:51:39
    #33970023
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
Евгений Путилин LINUXERЕсть интерфейс в котором за 50 методов
Есть метод в котором нужно в зависимости он заданной строки выбрать какой из методов того интерфейса нужно запустить
Есть ли более изящное(простое) решение чем использование рефлекшена?
if ... else if ...
НУ остальное уже извращения можно например используя ClassLoader переписывая байт код загружать класс которы будет звать нужный метод.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
     public   void  runMethod(String className, String methodName, Object parameter)  throws   
          СlassNotFoundException, IllegalAccessException, InvocationTargetException, 
          NoSuchMethodException, InstantiationException {
                
         Class  theClass =  Class .forName(className);
        
        Object theObject = theClass.newInstance();
        
        Method theMethod = theClass.getMethod(methodName, parameter.getClass());
        
        theMethod.invoke(theObject, parameter);
        
    }
...

где ифы? ;-)
...
Рейтинг: 0 / 0
07.09.2006, 11:37:51
    #33970215
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
mozheyko_d...
где ифы? ;-)
ифы были предложены как альтернатива рефлекшну.
есле кто не понял.
...
Рейтинг: 0 / 0
07.09.2006, 11:46:43
    #33970267
???
???
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
mozheyko_d
public void runMethod(String className, String methodName, Object parameter )
...
Method theMethod = theClass.getMethod(methodName, parameter.getClass() );

theMethod.invoke(theObject, parameter );
...


а если количество параметров разное, и среди них есть int и float?
...
Рейтинг: 0 / 0
07.09.2006, 11:56:02
    #33970322
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
mozheyko_dгде ифы? ;-)

Ой, а что это за 512 эксепшинов лезут из мега простого метода?
А как докапаться до эксепшина реально произошедшего в вызываемом методе?
А как искать ошибки если изменится сигнатура одного из 50 методов?
Откуда возьмуться Object[] params?

Очень изящно...

LINUXER
Есть интерфейс в котором за 50 методов
Есть метод в котором нужно в зависимости он заданной строки выбрать какой из методов того интерфейса нужно запустить
Есть ли более изящное(простое) решение чем использование рефлекшена?


Если методы имеют одинаковые сигнатуры и зависимость от строки простая, то лучше заменить один класс с 50 методами, на 50 классов с одним методом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 class  BaseHandler {
       private  String name;
      BaseHander(String name){  this .name = name;}
       public  String getName(){ return  name};
      
       abstract   void  handle();

       private   static  HashMap<String, BaseHandler> map =  new  HashMap<String, BaseHandler>();
       public   final   static   void  registerHandler(BaseHandler handler) {
             map.put(handler.getName(), handler);
      } 

       public   final   static  BaseHandler getHandler(String name){
             return  map.get(name); //todo: учесть ситуацию, когда не существует обработчика для name 
      }
}


 class  XXXHandler  extends  BaseHandler {
       void  handle() {
            System.out.println("Preved");
      }
}

//Инициализация. В принципе можно разместить в статическом блоке класса BaseHandler
BaseHandler.registerHandler( new  XXXHandler());
...

//usage       
String s = ...;
BaseHandler.getHandler(s).handle();
      

Наличии различных сигнатур у методов усложняет ситуацию.
Один из вариантов заключается в передаче в метод handle экземпляра класса ака provider/context позволяющего получить все необходимые параметры (в любом из 50 методов). Тут всё зависит от конкретной ситуации.

Код: plaintext
1.
2.
String s = ...;
BaseHandler.getHandler(s).handle( new  Context(....));
...
Рейтинг: 0 / 0
07.09.2006, 12:01:51
    #33970341
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
??? mozheyko_d
public void runMethod(String className, String methodName, Object parameter )
...
Method theMethod = theClass.getMethod(methodName, parameter.getClass() );

theMethod.invoke(theObject, parameter );
...


а если количество параметров разное, и среди них есть int и float?

Параметры в методе Invoke передаются в массиве типа Object[], поэтому их может быть любое количество, при этом вместо примитивных типов передаются классы оболочки (Integer, Float) (но в getMethod() при описании типов параметров нужно использовать int.class/float.class).
...
Рейтинг: 0 / 0
07.09.2006, 12:21:55
    #33970439
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
патч...
Код: plaintext
1.
2.
3.
4.
5.
6.
 class  XXXHandler  extends  BaseHandler {
      XXXHadler() { super ("xxx")}
       void  handle() {
            System.out.println("Preved");
      }
}
...
Рейтинг: 0 / 0
07.09.2006, 12:29:07
    #33970468
???
???
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
NotGonnaGetUs
в getMethod() при описании типов параметров нужно использовать int.class/float.class


а можно пример для методов:

doA(int a, String b, float c);
doB(int a, String b, Float c, Integer d);
...
Рейтинг: 0 / 0
07.09.2006, 13:19:19
    #33970683
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
???
а можно пример для методов:

doA(int a, String b, float c);
doB(int a, String b, Float c, Integer d);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
 import  java.lang.reflect.Method;
 import  java.lang.reflect.InvocationTargetException;

 public   class  Test {

    //1.4
     public   static   void  main(String[] arg)  throws  NoSuchMethodException, IllegalAccessException, InvocationTargetException {

        Test test =  new  Test();

        Method methodA = test.getClass().getDeclaredMethod("doA",  new   Class []{ int . class , String. class ,  float . class });
        methodA.invoke(test,  new  Object[]{ new  Integer( 1 ), "Petya",  new   Float ( 3 . 5 )});

        Method methodB = test.getClass().getDeclaredMethod("doB",  new   Class []{ int . class , String. class ,  Float . class });
        methodB.invoke(test,  new  Object[]{ new  Integer( 1 ), "Petya",  new   Float ( 3 . 5 )});

    }

    //1.5
     public   static   void  main(String[] arg)  throws  NoSuchMethodException, IllegalAccessException, InvocationTargetException {

        Test test =  new  Test();

        Method methodA = test.getClass().getDeclaredMethod("doA",  int . class , String. class ,  float . class );
        methodA.invoke(test,  1 , "Petya",  3 .5f);

        Method methodB = test.getClass().getDeclaredMethod("doB",  int . class , String. class ,  Float . class );
        methodB.invoke(test,  1 , "Petya",  3 .5f);

    }

     void  doA( int  a, String b,  float  c) {
        System.out.println("doA:" + a + " " + b + " " + c);
    }

     void  doB( int  a, String b,  Float  c) {
        System.out.println("doB:" + a + " " + b + " " + c);
    }
}

"Integer d" h/w.
...
Рейтинг: 0 / 0
07.09.2006, 13:27:06
    #33970718
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
NotGonnaGetUs
...
Ой, а что это за 512 эксепшинов лезут из мега простого метода?


это просто пример:)
NotGonnaGetUs
А как докапаться до эксепшина реально произошедшего в вызываемом методе?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
catch (InvocationTargetException e) {

    if (e.getCause() != null) {

        throw e.getTargetException();

    }

}

NotGonnaGetUs
А как искать ошибки если изменится сигнатура одного из 50 методов?

Проблема проектирования
NotGonnaGetUs
Откуда возьмуться Object[] params?


ну это пример для одного параметра, можно массив передать.

NotGonnaGetUs
Очень изящно...
...


ага, мне тоже нравится
...
Рейтинг: 0 / 0
07.09.2006, 13:31:12
    #33970742
LINUXER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
NotGonnaGetUsлучше заменить один класс с 50 методами, на 50 классов
Думаю это в любом случае не оправдано :D
...
Рейтинг: 0 / 0
07.09.2006, 13:45:07
    #33970808
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
mozheyko_d NotGonnaGetUs
...
Ой, а что это за 512 эксепшинов лезут из мега простого метода?


это просто пример:)


Вот я и предлагаю дописать этот "простой" пример до готового решения и прикинуть, чем он лушче if-ов.

mozheyko_d
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
catch (InvocationTargetException e) {

    if (e.getCause() != null) {

        throw e.getTargetException();

    }

}


Во первых бедные checked exception's стали unchecked,
а во вторых, не забываешь дописываешь "изящное решение" до рабочего состояния?

mozheyko_d
NotGonnaGetUs
А как искать ошибки если изменится сигнатура одного из 50 методов?

Проблема проектирования

Ага. Называется "использование рефлекшина" и создана "изящным решением".


mozheyko_d
NotGonnaGetUs
Откуда возьмуться Object[] params?


ну это пример для одного параметра, можно массив передать.

Ещё раз. Откуда возмётся значение для этого параметра?
Не будет ли оно создаваться в тех же if-ах, от которых "изящное решение" должно было избавить?

mozheyko_d
NotGonnaGetUs
Очень изящно...
...

ага, мне тоже нравится
Главное - это взаимопонимание :)
...
Рейтинг: 0 / 0
07.09.2006, 13:45:46
    #33970811
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
LINUXER NotGonnaGetUsлучше заменить один класс с 50 методами, на 50 классов
Думаю это в любом случае не оправдано :D

Чем 50 if else лучше?
...
Рейтинг: 0 / 0
07.09.2006, 13:58:15
    #33970880
???
???
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
mozheyko_d ну это пример для одного параметра, можно массив передать.
NotGonnaGetUs
вот и хотелось увидеть как будет выглядеть метод " public void runMethod(... " для таких методов

doA(int a, String b, float c);
doB(int a, String b, Float c, Integer d);
...
Рейтинг: 0 / 0
07.09.2006, 14:37:05
    #33971076
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
??? mozheyko_d ну это пример для одного параметра, можно массив передать.
NotGonnaGetUs
вот и хотелось увидеть как будет выглядеть метод " public void runMethod(... " для таких методов

doA(int a, String b, float c);
doB(int a, String b, Float c, Integer d);

Тот пример, что я привёл не подвластен зрению?

http://sql.ru/forum/actualpost.aspx?bid=38&tid=335342&mid=3105053&p=1&act=quot#3104714
...
Рейтинг: 0 / 0
07.09.2006, 14:57:39
    #33971187
???
???
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
NotGonnaGetUsТот пример, что я привёл не подвластен зрению?

)))

в примере явное указание типов int.class, String.class, float.class. А как все это будет runMethod(String className, String methodName, Object[] parameter) разбирать?
...
Рейтинг: 0 / 0
07.09.2006, 14:59:05
    #33971199
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
??? NotGonnaGetUsТот пример, что я привёл не подвластен зрению?

)))

в примере явное указание типов int.class, String.class, float.class. А как все это будет runMethod(String className, String methodName, Object[] parameter) разбирать?

Очевидно, что никак не будет. Кроме methodName и Object[] нужно передавать Class[].
...
Рейтинг: 0 / 0
07.09.2006, 16:07:21
    #33971510
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
NotGonnaGetUs[quot ???][quot NotGonnaGetUs]
Очевидно, что никак не будет. Кроме methodName и Object[] нужно передавать Class[].

На кой хер если class[] можно получить из объектов которые находятся в Object[]?
...
Рейтинг: 0 / 0
07.09.2006, 16:16:02
    #33971544
???
???
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
Blazkowiczclass[] можно получить из объектов которые находятся в Object[]
можно, только почему-то у меня так: кладу в Object[] (int, float), получаю (Integer, Float), где засада?

Ваш код в студию...
...
Рейтинг: 0 / 0
07.09.2006, 16:32:10
    #33971625
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
???[quot Blazkowicz]
...
кладу в Object[] (int, float)
...


Ого.
Это как так?
Может отрабатывает приведение типов?
...
Рейтинг: 0 / 0
07.09.2006, 16:44:49
    #33971689
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
Blazkowicz NotGonnaGetUs[quot ???][quot NotGonnaGetUs]
Очевидно, что никак не будет. Кроме methodName и Object[] нужно передавать Class[].

На кой хер если class[] можно получить из объектов которые находятся в Object[]?
Чтобы не заморачиваться с примитивными типами. Выше уже говорили.
...
Рейтинг: 0 / 0
07.09.2006, 17:57:27
    #33972034
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
methods
Blazkowicz NotGonnaGetUs[quot ???][quot NotGonnaGetUs]
Очевидно, что никак не будет. Кроме methodName и Object[] нужно передавать Class[].

На кой хер если class[] можно получить из объектов которые находятся в Object[]?

Это можно сделать, только если в методе нет аргументов простых типов (int, etc).

О чём, собственно, уже написали...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / methods / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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