Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов через invoke, хелпъ 
:(
    Опции темы
Alone
Дата 21.8.2004, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Народ, подскажите, как правильно пользоваться invoke?
Допустим я хочу через invoke выполнить вызов Obj.myMethod();
Что для этого надо сделать?
java.lang.reflect.Method m=Obj.myMethod();
m.invoke(Obj.myMethod );
?


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Alone
Дата 21.8.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Конкретизирую вопрос...
Допустим у меня есть вызов auth.SteVisible(false);
после этого идет операция с сетью, и етесственно объект auth как бы замораживается... т.е. перерисовки (скрытия) не происходит.
Код

try{
           java.lang.Class _class=auth.getClass();

//             Object[] args_value = { new ?????? };  // надо передать false в качестве параметра
            java.lang.Class[] args_class = { java.lang.Class.forName ("???????") };
           java.lang.reflect.Method m=_class.getMethod("setVisible", args_class );
           m.invoke(_class, args_value);
       }catch(Exception e){
             System.out.println(e.getMessage() );
       }
}



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 21.8.2004, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Ну вот так, например

Код

import java.lang.reflect.*;

class MyClass
{
   public void method(int n)
   {
       for (int i = 0; i < n; i++)
       {
           System.out.println("Hello, world-" + i);
       }
   }
   
}

public class Test
{
   public static void main(String [] arg) throws Exception
   {
       MyClass myClass = new MyClass();
       Method method = MyClass.class.getMethod("method", new Class [] { int.class });
       Object[] args = new Object[1];
       Object value = new Integer(3);  
       args[0] = value;      
       method.invoke(myClass, args);
   }
}


Для boolean будет соответственно boolean.class и new Boolean(false);

http://www-106.ibm.com/developerworks/java...rary/j-dyn0603/
http://www-106.ibm.com/developerworks/java.../j-dyn0715.html

Это сообщение отредактировал(а) Domestic Cat - 22.8.2004, 00:45


--------------------

PM   Вверх
DarkDS
Дата 22.8.2004, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: 11
Всего: 16



Уже как то постил... Надеюсь поможет smile.gif

Если пакет и классы уже есть класспасе, то делается все просто:

Код

String pakName = "com.test.";
String className = "Test";
try
{
  //Get panel class
  Class pClass = Class.forName( panelClassName );
/*
//Если у класса нет коснтруктора, без параметров, но известен конструктор с конечным числом
//параметров.(к примеру есть 2-а параметра и известны их классы). Если не понятно - объясню
  Constructor constructor = pClass.getConstructor( new Class[]{классПараметра1,классПараметра2 } );
  Object o = constructor.newInstance( new Object[]{параметр1, параметр2} );
*/
  Object o = pClass.newInstance();
  Class fClass = o.getClass();
  Method method = fClass.getMethod( methodName, new Class[]{} ); //Нет параметров... Иначе new Class[]{классПараметра1,классПараметра2 }
  Object obj = method.invoke( object, new Object[]{} ); //Нет параметров... Иначе new Object[]{параметр1, параметр2}
//Полученный obj - результат вызова метода
}
catch ( Exception e )
{
  //Error
  e.printStackTrace();
  removeAll();
}


Добавлено @ 01:13
+ еще была тема smile.gif
http://forum.vingrad.ru/index.php?showtopi...11&hl=getmethod
PM MAIL   Вверх
Alone
Дата 25.8.2004, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Domestic Cat Пасиб за пример. примерно таким путем и шел, но стопорнулся на классе типа boolean... sad.gif
Теперь все стало на свои места.


DarkDS Вот! Именно этот постинг я и искал по форуму... Пасиб! smile.gif



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Alone
Дата 25.8.2004, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Цитата(Domestic @ 21.8.2004, 22:57)
Код

import java.lang.reflect.*;

class MyClass
{
   public void method(int n)
   {
       for (int i = 0; i < n; i++)
       {
           System.out.println("Hello, world-" + i);
       }
   }
   
}

public class Test
{
   public static void main(String [] arg) throws Exception
   {
       MyClass myClass = new MyClass();
       Method method = MyClass.class.getMethod("method", new
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Class [] { int.class });
       Object[] args = new Object[1];
       Object value = new Integer(3);  
       args[0] = value;      
       method.invoke(myClass, args);
   }
}


Можно уточнить?
Что за метод class у объекта MyClass ???


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 25.8.2004, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: 11
Всего: 16



Это статик переменная, которая идет от Object и инициализированная классом текущего объекта.
То есть class у MyClass инициализированна структурой java.reflection.Class, которая описывает MyClass smile.gif
Точно такую же структуру вернет вызов метода myClass.getClass();
smile.gif
PM MAIL   Вверх
Alone
Дата 25.8.2004, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Насчет getClass согласен, а вот переменной class у моего объекта (public class authPanel extends javax.swing.JPanel ) нет.



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 25.8.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: 11
Всего: 16



Она есть у всех объектов smile.gif Это одна из особенностей языка smile.gif
Добавлено @ 15:50
А javax.swing.JPanel наследуется от объекта (не в прямую а через других родительские классы), как и все классы в яве. Так вот у объекта встроена статическая переменная класс smile.gif
PM MAIL   Вверх
Alone
Дата 26.8.2004, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Блин... sad.gif
Вот отрывок из кода
Код

       //auth.setVisible(false);    //было

       // стало
       java.lang.Class _class=auth.getClass();
       try{
           java.lang.reflect.Method m=_class.getMethod("setVisible", new Class [] {boolean.class});
           Object [] args=new Object[1];
           Object value=new Boolean(false);
           args[0]=value;
           m.invoke(_class, args);
       }catch (Exception e){
           System.out.println("Exception e="+e.getMessage());
       }

при выполнении получаем
Exception e=object is not an instance of declaring class



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 26.8.2004, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: 11
Всего: 16



У тебя ошибка в m.invoke(_class, args);
Там должно быть m.invoke(auth, args);
Так как первым аргументом должен быть инстансированный объект нужного тебе класса smile.gif
PM MAIL   Вверх
Alone
Дата 26.8.2004, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



Да, действительно.
Но поблема остается...
метод setVisible(false) объекта auth не вызывается... Объект остается замороженным, до окончания работы с сетью. sad.gif


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 26.8.2004, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



А на какой строке падает ?
PM MAIL WWW ICQ   Вверх
Alone
Дата 26.8.2004, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: 3
Всего: 6



с помощю дебага выяснил, что метод setVisible(false) вызывается, но не понимаю, почему объект не перерисовывается???
Добавлено @ 10:54

вот отладочный метод объекта auth, который я вызывал через invoke
вместо setVisible(false)
Код
public void Hide(boolean a){
       System.out.println("Has called hide()");
       mainObj.auth.setVisible(false);
       mainObj.jPanel1.updateUI();
   }

в дебаговый вывод он мне пишет, что метод был вызван. Тоесть типа Ок.
но до окончания работы с сетью (чтение/запись в сокет) это где то около 3-5сек
объект остается на экране как и прежде, с нажатой кнопкой... sad.gif



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 26.8.2004, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: 11
Всего: 16



У тебя работа с сетью идет в том же треде что и свинги работают?
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.