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


Автор: StepS 10.10.2005, 12:41
Привет всем, такой вопрос:
есть строка: "MyObject.MyMethod("+10+");" как эту строку выполнить чтоб она отработала, т.е. нашелся объект MyObject и у него вызвался метод MyMethod в который передалось число 10
???

И вообще такое возможно ? smile

Автор: batigoal 10.10.2005, 12:58
Видимо, надо копать в сторону механизма рефлексии. Можно посмотреть общие сведения в нашем FAQ ( http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=main_panel&article=2888), но решения твоей проблемы там нет.

Автор: pvo 10.10.2005, 13:06
Советую глянуть в сторону BeanShell или JavaScript( Rhino ).
Они как раз и используют reflection, но пользоваться ими удобнее.

Еще вариант - сделать динамическое создание и компиляцию классов, но это сложнее и оправдано в том случае, если предполагается повторное использование выражений.

Автор: StepS 10.10.2005, 13:10
то что нужно копать в сторону reflection эт я знаю smile, только вот,ознакомившись с этим механизмом, не смог сообразить как такое реализовать ! Я подумал может кто-то с таким уже сталкивался и он поможет примерчиком или хотябы скажет в таком-то документе в такой-то главе описана похожая задача, посмотри там !

Автор: batigoal 10.10.2005, 13:18
Имхо, получить объект по имени нельзя - у него ведь нет имени smile
Только если создать новый объект по имени класса.

Автор: Metal_Heart 10.10.2005, 13:36
а если объекту добавтить поле "ИМЯ" ?

Автор: pvo 10.10.2005, 13:38
Пример использования BeanShell (http://www.beanshell.org/). С JavaScript - похоже. Его искать на мозилле нужно, называется rhino.
Код

                                Interpreter interpreter = new Interpreter();
                                String script = "MyObject.myMethod( value );"
                Object src = new MyObject();
                interpreter.set("MyObject", src);
                                interpreter.set( "value", new Integer( 10 ) );
                interpreter.eval(script);






Цитата(StepS @ 10.10.2005, 12:41)
т.е. нашелся объект MyObject и

А вот такая задачка в общем случае неразрешима ... Для того, чтобы объект нашелся, он должен где-то храниться, например в мапе

Автор: StepS 10.10.2005, 13:49
Цитата

Код

      Interpreter interpreter = new Interpreter();    
                                String script = "MyObject.myMethod( value );"    
                Object src = new MyObject();    
                interpreter.set("MyObject", src);    
                                interpreter.set( "value", new Integer( 10 ) );    
                interpreter.eval(script);



это если мы знаем какой объкт мы собираемся создавать ! а если не знаем ..??
например я пишу в текстовом поле: MyObject.BuildAnyThing() и нажимаю кнопочку <Execute> и начинает выполнятся метод BuilAnyThing() класса MyObject. и вместо MyObject я могу написать YouObject, если такой есть класс !

Автор: pvo 10.10.2005, 13:57
Цитата(StepS @ 10.10.2005, 13:49)
это если мы знаем какой объкт мы собираемся создавать ! а если не знаем ..??
например я пишу в текстовом поле: MyObject.BuildAnyThing() и нажимаю кнопочку <Execute> и начинает выполнятся метод BuilAnyThing() класса MyObject. и вместо MyObject я могу написать YouObject, если такой есть класс !


Я же говорю, что в общем случае задачка поиска любого объекта - нерешаема.
Тут надо малость конкретизировать - например, если MyObject каждый раз создается новый и имеет ктор без параметров, то пишешь что-нить типа:

Код

     String name = "MyObject"; // Считаем, что пакета нет.
     try {
         Class clazz = Class.forName( name );
         Object instance = clazz.newInstance();
         interpreter.set( name, instance );
         ....
   
     } catch ( Exception ex ) {
          // Обработка ошибки
    }



А если тебе нужно использовать произвольный объект, созданный в приложении, то - извини, но так не получится (ИМХО)

Автор: StepS 10.10.2005, 14:39
ясно спасиба !
я такой же вопрос задал на форуме C# там есть решение такой задачи ! думал в Java тоже есть, ан нет smile
еще разок спасиб, надеюсь что скоро в яве такая возможность появиться

Автор: pvo 10.10.2005, 14:55
Цитата(StepS @ 10.10.2005, 14:39)
ясно спасиба !
я такой же вопрос задал на форуме C# там есть решение такой задачи ! думал в Java тоже есть, ан нет smile
еще разок спасиб, надеюсь что скоро в яве такая возможность появиться


Глянул, что тебе там написали - ровно тоже самое, что и тут.
Поиск класса в Java тоже можно реализовать, например с помощью Package.getPackages();
Нельзя найти экземпляр объекта, созданный где-то в программе.

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