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

时间:2015-07-27 22:35:27

标签: java reflection

我有一个Java程序,它根据用户输入生成数学方程式。我想评估这个等式,但迭代它的语法树是相当慢的。更快的解决方案是将等式放入Java文件,编译它,并调用已编译的代码(在运行时)。以下是我目前正在做的事情:

  • 使用该函数作为静态成员创建Equation.java文件。例如,如果生成的等式为3*x + 2*y(实际等式要复杂得多),程序将创建文件

    public class Equation {
        public static DoubleBinaryOperator equation = (x, y) -> 3*x + 2*y;
    }
    
  • 使用JavaCompiler
  • 将其编译为Equation.class
  • 动态导入类文件并使用反射
  • 调用方程式

这是一个大量的样板,似乎应该很简单。是否有更简单的方法将此等式转换为函数并在运行时调用它?

2 个答案:

答案 0 :(得分:1)

根据您的等式的复杂程度,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

答案 1 :(得分:0)

为什么你必须在运行时编译它..编译为jar ..并将其保存到文件夹..在运行时加载它..

这是一个有用的答案如何加载jar文件

How to load a jar file at runtime