Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / invoke / 7 сообщений из 7, страница 1 из 1
07.03.2005, 03:49
    #32949373
zZzZz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invoke
надо обработать некоторую команду и получить ответ на неё.
хочу делать так: doIt, должен вызвать соответсвующий команде метод для обработки и передать в него параметр для этой команды. команда обрабатывается и этот же метод должен вернуть ответ. вопрос - как получить ответ?
я так понимаю, что invoke работает с новым объектом, т.е. чтобы получить мой ответ нужно извращаться с объектами...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   void  doIt() {
...
             Class  X =  this .getClass();
             Class [] methodParameterTypes =  new   Class []{ArrayList. class };
            Object[] methodArguments =  new  Object[]{args};

            Method method = X.getMethod(command, methodParameterTypes);

             Class [] constructorParameterTypes =  new   Class []{};
            Object[] constructorArguments =  new  Object[]{};
            Constructor constructor = X.getConstructor(constructorParameterTypes);
            Object obj = constructor.newInstance(constructorArguments);

            method.invoke(obj, methodArguments);
...
}
...
Рейтинг: 0 / 0
07.03.2005, 12:16
    #32949495
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invoke
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public  Object doIt() {
...
             Class  X =  this .getClass();
             Class [] methodParameterTypes =  new   Class []{ArrayList. class };
            Object[] methodArguments =  new  Object[]{args};

            Method method = X.getMethod(command, methodParameterTypes);

             Class [] constructorParameterTypes =  new   Class []{};
            Object[] constructorArguments =  new  Object[]{};
            Constructor constructor = X.getConstructor(constructorParameterTypes);
            Object obj = constructor.newInstance(constructorArguments);

            Object result = method.invoke(obj, methodArguments);
...
             return  result;
}

Но лучше избавиться от использования рефлекшина, если метод doIt вызывается более или менее часто...
...
Рейтинг: 0 / 0
07.03.2005, 12:44
    #32949516
zzzzzz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invoke
NotGonnaGetUs
Но лучше избавиться от использования рефлекшина, если метод doIt вызывается более или менее часто...

каким образом?
...
Рейтинг: 0 / 0
07.03.2005, 14:20
    #32949589
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invoke
зависит от твоих целей.

например так:
Код: plaintext
1.
2.
3.
 if  ("xxx".equals(command)) {
     return   this .xxx(yyy);
}  else   if  ...

или создать интерфейс с методом doIt()
и накидать в map его реализации:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
HashMap<String, IDoIt> map = ...;
map.put("xxx",  new  IDoIt{
    Object doIt(...){
       ....
    }
}
...
Object doIt(){
    ...
    Object result =  map.get(command).doIt(...);
    ...
     return  result;
}
...

Возможно, есть шанс заменить String command на класс YourCommand.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 abstract   class  YourCommand {
     final   static  YourCommand XXX =  new  XXXCommand();
     abstract  Object doIt(...);
     private   static   class  XXXCommand{
        Object doIt(...){
              ....
        }
   }
}

Object doIt(...) {
   ...
    Object result = command.doIt();
   ...
}

можно ещё много чего на фантазировать. всё зависит от конкретной ситуации.

на мой взгляд, рефлекшин оправдан только в случае, если описание класса не доступно на момент компиляции класса, либо для жестких "хаков" вроде доступа к private членам.
...
Рейтинг: 0 / 0
10.03.2005, 21:45
    #32954480
zxc
zxc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invoke
NotGonnaGetUsзависит от твоих целей.

Возможно, есть шанс заменить String command на класс YourCommand.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 abstract   class  YourCommand {
     final   static  YourCommand XXX =  new  XXXCommand();
     abstract  Object doIt(...);
     private   static   class  XXXCommand{
        Object doIt(...){
              ....
        }
   }
}

Object doIt(...) {
   ...
    Object result = command.doIt();
   ...
}

что то я тут ничего не понял. можешь пояснить?
...
Рейтинг: 0 / 0
10.03.2005, 21:46
    #32954481
zxc
zxc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invoke
NotGonnaGetUsзависит от твоих целей.

Возможно, есть шанс заменить String command на класс YourCommand.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 abstract   class  YourCommand {
     final   static  YourCommand XXX =  new  XXXCommand();
     abstract  Object doIt(...);
     private   static   class  XXXCommand{
        Object doIt(...){
              ....
        }
   }
}

Object doIt(...) {
   ...
    Object result = command.doIt();
   ...
}


что то я тут ничего не понял. можешь пояснить?
...
Рейтинг: 0 / 0
11.03.2005, 00:02
    #32954542
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
invoke
Был код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 class  XXX {
    private  String  command ...
   
    void  setCommand(String s){
      command = s;
   }

    private  Object yyy() {
         this .xzxz();
   }

   Object doIt(){
          ....
           if  command.equals("yyy"){
                    return  yyy();
          }  else   if  ...  else   if ...
   }

}
Код: plaintext
1.
2.
3.
XXX x =  new  XXX();
x.setCommand("yyy");
x.doIt();
Делаем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 class  XXX {
    private  YourCommand command ...
   
    void  setCommand(YourCommand s){
      command = s;
   }

   Object doIt(){
          ....
           return  command.doIt();
   }

}

 abstract   class  YourCommand {
    YourCommand YYY =  new  YourCommand {
          Object doIt(XXX o){ 
                 o.xzxz();
          }
    }
     abstract  Object doIt(XXX o)
}
Код: plaintext
1.
2.
3.
XXX x =  new  XXX();
x.setCommand(YourCommand.YYY);
x.doIt();
или просто
Код: plaintext
1.
2.
3.
4.
5.
6.
XXX x =  new  XXX();
x.setCommand( new  YourCommand(){
    Object doIt(XXX o){
           System.out.println("hi");
    }
});
x.doIt();
"+" - можно добавлять команды, не трогая класс ХХХ.
В зависимости от ситуации, в этом может быть смысл.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / invoke / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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