这个问题在stackoverflow here上有这个问题,但我想问一下在Java中是否可以做类似的事情。如何将字符串转换为Java中的函数?
我想做类似于desmos的东西,就像那个人在Javascript中做的一样,但我想用Java编写它使用lwjgl 2.我是Java新手,我想知道是否有可能将一段字符串转换为一个方法。可能吗?
我已经寻找可能的选择,我发现你可以使你自己的Java eval()
方法。但我不想替换窗口宽度中每个像素的字符串中的x
。
在此先感谢。
这个问题在stackoverflow here上有这个问题,但我想问一下在Java中是否可以做类似的事情。如何将字符串转换为Java中的函数?
我想做类似于desmos的东西,就像那个人在Javascript中做的一样,但我想用Java编写它使用lwjgl 2.我是Java新手,我想知道是否有可能将一段字符串转换为一个方法。可能吗?
我已经寻找可能的选择,我发现你可以使你自己的Java eval()
方法。但我不想替换窗口宽度中每个像素的字符串中的x
。
在此先感谢。
您需要的是一个可以评估表达式的引擎/库,它在执行时定义为字符串。如果您将评估代码包装到函数调用中(例如lambda函数),您将获得所需的内容。
选项1:您可以使用exp4j。 exp4j是一个小型脚本库,能够在执行时评估表达式和函数。这里有一个例子:
Expression e = new ExpressionBuilder("3 * sin(y) - 2/(x - 2)")
.variables("x", "y")
.build()
.setVariable("x", 2.3)
.setVariable("y", 3.14);
double result = e.evaluate();
选项2:可以使用Java's script engine。你可以用它来评估定义的表达式,例如,在JavaScript:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("sin(1.25)");
方案3:编译为本地的Java。通过这种方法,您可以使用模板来生成带有包含表达式的类的.java文件。比你调用Java编译器。这种方法的缺点是在实现中有一些复杂性,并且有一些初始等待时间(直到编译完成),但性能是最好的。这里有一些链接探索:
注,心里有你需要考虑安全性。允许用户输入可在没有安全限制的情况下进行评估的代码可能非常危险。
您可以使用字节码生成扩展选项3 - 可以是编译时(使用某个构建工具插件),也可以是运行时。 –
非常感谢你的帮助。你能否发表一个关于我如何使用第三种方案的链接。这似乎很有趣。 – odermark
@odermark,添加了响应的链接。我认为首先应该给你一个好的开始。 –