powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / methods
25 сообщений из 42, страница 1 из 2
methods
    #33969675
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть интерфейс в котором за 50 методов
Есть метод в котором нужно в зависимости он заданной строки выбрать какой из методов того интерфейса нужно запустить
Есть ли более изящное(простое) решение чем использование рефлекшена?
...
Рейтинг: 0 / 0
methods
    #33969914
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что сложного в reflection?
...
Рейтинг: 0 / 0
methods
    #33969970
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LINUXERЕсть интерфейс в котором за 50 методов
Есть метод в котором нужно в зависимости он заданной строки выбрать какой из методов того интерфейса нужно запустить
Есть ли более изящное(простое) решение чем использование рефлекшена?
if ... else if ...
НУ остальное уже извращения можно например используя ClassLoader переписывая байт код загружать класс которы будет звать нужный метод.
...
Рейтинг: 0 / 0
methods
    #33969972
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
if () {
} else if () {
} else if () {
...
...
Рейтинг: 0 / 0
methods
    #33970023
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Путилин 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
methods
    #33970215
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozheyko_d...
где ифы? ;-)
ифы были предложены как альтернатива рефлекшну.
есле кто не понял.
...
Рейтинг: 0 / 0
methods
    #33970267
???
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
methods
    #33970322
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
methods
    #33970341
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
??? 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
methods
    #33970439
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
патч...
Код: plaintext
1.
2.
3.
4.
5.
6.
 class  XXXHandler  extends  BaseHandler {
      XXXHadler() { super ("xxx")}
       void  handle() {
            System.out.println("Preved");
      }
}
...
Рейтинг: 0 / 0
methods
    #33970468
???
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
в getMethod() при описании типов параметров нужно использовать int.class/float.class


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

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

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
methods
    #33970718
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
methods
    #33970742
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsлучше заменить один класс с 50 методами, на 50 классов
Думаю это в любом случае не оправдано :D
...
Рейтинг: 0 / 0
methods
    #33970808
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
methods
    #33970811
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LINUXER NotGonnaGetUsлучше заменить один класс с 50 методами, на 50 классов
Думаю это в любом случае не оправдано :D

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

doA(int a, String b, float c);
doB(int a, String b, Float c, Integer d);
...
Рейтинг: 0 / 0
methods
    #33971076
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
??? 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
methods
    #33971187
???
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsТот пример, что я привёл не подвластен зрению?

)))

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

)))

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

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

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

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


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

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

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

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

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


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