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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычислить значение выражения, во время хода программы 
V
    Опции темы
Larrr
Дата 19.7.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



Надо вычислить значение более сложного выражения, заданного в формате String во время runtime.
Например:

Код

public class A
  {
    private boolean    a = true;
    private boolean    b = true;

    public boolean isA ()
    {
        return a;
    }

    public void setA (boolean a)
    {
        this.a = a;
    }

    public boolean isB ()
    {
        return b;
    }

    public void setB (boolean b)
    {
        this.b = b;
    }
}



Код

public class B
  {
    private A    a = new A ();

    public void interpret ()
    {
        a.setA (true);
        a.setB (false);

        String s = "a.isA() && a.isB()";

        //Вот тут надо как-то вычислить что s = "false" в данном контексте
     }
}



Надо вычислить значение выражения, заданного в строке: String s = "a.isA() && a.isB()"; Я смотрела Bean Shell, но он вроде с такими выражениями не работает - у меня по крайней мере не получилось и в их тюториале я ничего не нашла. Есть какой-нибудь изящный способ это вычислить? Ну или не очень изящный хотя бы.

PS. Если вдруг что, класс А в моем проекте довольно сложный и писать его в скрипте целиком - никак. Цель не оправдает средства в смысле   smile  


Это сообщение отредактировал(а) Larrr - 19.7.2007, 21:53
PM MAIL WWW ICQ   Вверх
nornad
Дата 20.7.2007, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Может, стоит JavaScript использовать?

Добавлено через 43 секунды
А... так тебе надо классы из твоего же проекта?
Ну, тогда посмотри в сторону JXPath.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ecologist
Дата 20.7.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 2
Всего: 9



А может попробовать компилировать класс и использовать его - надо поискать по форуму - проходило что-то о run-time compile
PM MAIL   Вверх
Larrr
Дата 20.7.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



Цитата(ecologist @ 20.7.2007,  08:51)
А может попробовать компилировать класс и использовать его - надо поискать по форуму - проходило что-то о run-time compile

Классы А и В уже скомпилированны - они в одном проекте находятся. Потом я динамически делаю строку вида как описано выше и надо вычислить ее значение. Или можно это сделать с помощью отдельного класса?
PM MAIL WWW ICQ   Вверх
LSD
Дата 20.7.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Larrr @  19.7.2007,  22:51 Найти цитируемый пост)
Я смотрела Bean Shell, но он вроде с такими выражениями не работает - у меня по крайней мере не получилось и в их тюториале я ничего не нашла. Есть какой-нибудь изящный способ это вычислить? Ну или не очень изящный хотя бы.

Очень даже работает. Если ты использушь JDK 1.6, то тебе даже ничего больше и не требуется, все есть:
Код
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.put("frameTitle", new Date());
String script = "importPackage(java.awt);\n" +
                "importClass(java.awt.Frame);\n" +
                "var frame = new java.awt.Frame(frameTitle.toString());\n" +
                "frame.setVisible(true);\n" +
                "println(frame.title);";
engine.eval(script);



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Larrr
Дата 20.7.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



Спасибо. Я использую 1.5. Не подскажешь, можно ли как-то перенести его в 5 версию? 

PS. Попробовала сделать так:

Код

public class B
  {
    private A    a = new A ();

    public void interpret ()
    {
        a.setA (true);
        a.setB (false);

        String            s       = "a.isA() && a.isB()";

        ScriptEngineManager    factory = new ScriptEngineManager ();
        ScriptEngine        engine  = factory.getEngineByName ("JavaScript");

        try
        {
            engine.eval ("boolean b = " + s);
            System.out.println (engine.get ("b"));
        } catch (Exception ex)
        {
            System.out.println ("Error");
        }
    }
}



-выкидывается ошибка...
Суть в том, что моя строка формируется динамически и в каждом случае она разная. Нужно в Engine импортировать предыдущий код или это делается как-то по-другому?

Это сообщение отредактировал(а) Larrr - 20.7.2007, 16:46
PM MAIL WWW ICQ   Вверх
LSD
Дата 21.7.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Larrr @  20.7.2007,  17:26 Найти цитируемый пост)
PS. Попробовала сделать так:
...
-выкидывается ошибка...

Для BeanShell код будет выглядеть немного по другому:
Код
import bsh.*;

public class BeanShell
{
  public static final String SCRIPT = "var msg = a.getMessage(); b.printMessage(msg); return msg;";

  public static void main(String[] args) throws EvalError
  {
    Interpreter interpreter = new Interpreter();
    interpreter.set("a", new A());
    interpreter.set("b", new B());
    Object result = interpreter.eval(SCRIPT);
    System.out.println("result = " + result);
  }

  public static class A
  {
    public String getMessage()
    {
      return "Hello world!";
    }
  }

  public static class B
  {
    public void printMessage(String message)
    {
      System.out.println(message);
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Larrr
Дата 21.7.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 29.1.2006
Где: Прага

Репутация: нет
Всего: 2



LSD, огромное спасибо!  smile 
PM MAIL WWW ICQ   Вверх
LSD
Дата 22.7.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Пожалуйста smile

P.S. Не забывай помечать вопрос решенным (кнопка над первым постом).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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