我有一个基于用户输入生成数学方程的Java程序。我想计算这个方程,但是遍历它的语法树很慢。更快的解决方案是将方程放入Java文件中,对其进行编译,然后调用编译后的代码(在运行时)。下面是我目前正在做的:
-
创建
Equation.java
文件,该函数作为静态成员。例如,如果生成的方程是3*x + 2*y
(实际的方程要复杂得多),程序将创建文件public class Equation { public static DoubleBinaryOperator equation = (x, y) -> 3*x + 2*y; }
- 编译成
Equation.class
使用javaccompiler - 动态导入类文件并使用反射调用方程
对于一些看起来应该很简单的东西来说,这是一个巨大的样板文件。有没有一种更简单的方法把这个方程变成一个函数,并在运行时调用它?
根据您的方程式有多复杂,JavaScript计算引擎Nashorn
可能值得一试。
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Object o = engine.eval("1 + 2 * 3");
System.out.println(o); // prints 7
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("x", 10);
System.out.println(engine.eval("x + 1")); // prints 11
为什么你必须在运行时编译它…编译成jar ..然后保存到一个文件夹…在运行时加载它。
下面是如何加载jar文件 的有用答案如何在运行时加载jar文件