Почему люди говорят, что в Java не может быть оценщика выражений?

Я знаю, что по умолчанию в Java нет так называемого метода eval (который я называю «злым»). Это звучит плохо - знать, что у вас нет того, что есть у многих других. Но, что еще хуже, вы получаете уведомление о том, что вы не можете получить его.

Мой вопрос: что за этим стоит? Я имею в виду, что Google просто возвращает огромное количество старых данных и ложных причин - даже если есть ответ, который я ищу, я не могу отфильтровать его от людей, которые просто бросают общие слова-теги.

Меня не интересуют ответы, которые говорят мне, как это обойти; Я могу это сделать сам:

Использование Bean Scripting Framework (BSF)

Пример файла . py (в папке py ) содержимое:

def factorial(n): 
    return reduce(lambda x, y:x * y, range(1, n + 1))

И код Java:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("jython");
engine.eval(new FileReader("py" + java.io.File.separator + "sample.py"));
System.out.println(engine.eval("factorial(932)"));

Использование спроектированных мостов, таких как JLink

example

Это эквивалентно:

String expr = "N[Integrate[E^(2 y^5)/(2 x^3), {x, 4, 7}, {y, 2, 3}]]";
System.out.println(MM.Eval(expr));
//Output: 1.5187560850359461*^206 + 4.2210685420287355*^190*I

Другие методы

  • Использование Dijkstras маневровый алгоритм или аналогичный и написание оценщика выражений с нуля.
  • Использование сложных регулярных выражений и операций со строками с делегатами и HashMultimaps.
  • Использование библиотеки выражений Java
  • Использование языка выражений Java
  • Использование совместимого с JRE языка сценариев, такого как BeanShell.
  • Использование ассемблера Java и подход, описанный ниже прямое манипулирование байт-кодом, например Javaassist.
  • Использование API компилятора Java и отражений.
  • Использование Runtime.getRuntime (). exec как root
11
задан Svante 12 March 2011 в 21:34
поделиться