在Java 8中动态创建和编译函数



我有一个基于用户输入生成数学方程的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文件

相关内容

  • 没有找到相关文章

最新更新