Мне известно, что по умолчанию у Java нет так называемого eval
(то, что я произношу как "злой" ) метод. Это звучит как плохая вещь, зная, что у вас нет того, что делают многие другие. Но еще хуже кажется, что вас не знают, что вы не можете этого сделать.
Мой вопрос: что такое твердое рассуждение? Я имею в виду, что Google просто возвращает огромное количество старых данных и ложных причин. Даже если есть ответ, который я ищу, я не могу отфильтровать его от людей, которые просто бросают общие теги-слова.
Меня не интересуют ответы, которые говорят мне, как обойти это; Я могу сделать это сам:
Использование Bean Scripting Framework (BSF)
Файл sample.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
Это эквивалентно:
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
Другие методы
- Использование алгоритма Shynchstras или аналогичного сценария и написания оценщика выражений с нуля.
- Использование сложных регулярных выражений и строковых манипуляций с делегатами и HashMultimaps.
- Использование библиотеки Java Expressions
- Использование языка выражения Java
- Использование JRE-совместимого скриптового языка, такого как BeanShell.
- Использование Java Assembler и подход ниже или прямой манипуляции с байт-кодом, например Javaassist.
- Использование API компилятора Java и отражений.
- Использование
Runtime.getRuntime().exec
как root