Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вызов неизвестных методов (eval)


Автор: MatrixMaster 24.10.2003, 17:10
дано: имена пакетов, классов, методов.
Надо: подключить данные классы данных пакетов, и вызвать (выполнить) данный метод.

Как это сделать..
eval'а - то нет wink.gif

Автор: Sun 24.10.2003, 17:41
А нельзя ли поподробней? Насколько я понял, нужно организовать выполнение методов классов на лету, указав имя класса и имя метода?
Если так, то существует класс java.lang.Class, который может вернуть экземпляр класса указав имя класса и пакет. Есть также возможность извлечь метод (invoke) нужного класса.
Этот механизм чем-то похож на работу с Dll. При помощи Classloader загружается класс, вызывается конструктор а затем извлекаются и запускаются методы.

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

Код

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();
}



Автор: MatrixMaster 25.10.2003, 17:35
Sun ага. верно ты понял.
DarkDS спасибо!

Автор: MatrixMaster 26.10.2003, 19:20
вот вопросец возник в ходе реализации.

как определить нужный нам метод, ежели мы знаем его имя, но не знаем в какой последовательности требуется задавать список параметров.

поясню.
что бы использовать метод getMethod нужно знать
Цитата
new Class[]{классПараметра1,классПараметра2

равно как и
Цитата
Object[]{параметр1, параметр2}

в принципе список можно получить используя getParameterTypes() класса Method, но ведь у нас ЕЩЕ нет объекта типа Method, что бы вызвать этот getParameterTypes()..



Автор: DarkDS 27.10.2003, 10:04
Можно получить список всех методов у класса и проверять их имена... .getMethods(). возращает Method[]
Но... Тут может возникнуть проблемма с заполнением параметров..

Автор: MatrixMaster 27.10.2003, 10:51
DarkDS жаль. я думал что есть более красивый метод, чем тот, что я реализовал ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)