Мне известно, что по умолчанию в 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
Другие методы
- Использование алгоритма Dijkstras shunting-yard или аналогичного и написание оценщика выражений с нуля.
- Использование сложных регулярных выражений и операций со строками с делегатами и HashMultimaps.
- Использование библиотеки выражений Java
- Использование языка выражений Java
- Использование JRE-совместимого языка сценариев, такого как BeanShell.
- Использование Java Assembler и подход ниже или прямое манипулирование байт-кодом, как Javaassist.
- Использование API компилятора Java и отражений.
- Использование
Runtime.getRuntime().exec
в качестве root