Java 中是否有 eval() 函数?

2022-08-31 07:11:10

我有一个如下所示的字符串:

String str = "4*5";

现在我必须通过使用字符串来获取的结果。20

我知道在其他一些语言中,该函数将执行此操作。如何在Java中执行此操作?eval()


答案 1

您可以使用 ScriptEngine 类并将其作为 Javascript 字符串进行评估。

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("4*5");

可能有更好的方法,但这种方法有效。


答案 2

没有标准的Java类或方法可以做你想做的事。您的选项包括:

  • 选择并使用一些第三方表达式计算库。例如,JEL 或此处列出的六个库中的任何一个

  • 将表达式包装在具有方法的类的 Java 源代码中,将其发送到 Java 编译器,然后加载生成的已编译类。eval

  • 使用一些可以从 Java 调用的脚本语言作为表达式计算器。可能性包括Javascript1,BeanShell等。符合 JSR 223 的脚本语言实现可以通过脚本 API 调用

  • 从头开始编写自己的表达式计算器。

第一种方法可能是最简单的。第二种和第三种方法存在潜在的安全风险,如果您从不受信任的用户处获取要计算的表达式。(想想代码注入。


1 - Java SE中的Javascript是一个移动的目标。从Java 6开始,Mozilla的Rhino Javascript实现的一个版本与Java SE捆绑在一起。在Java 8中,它被Nashorn取代。在Java 11中,Nashorn被弃用,最后从核心代码库中删除。截至2021年,Rhino和Nashorn都作为单独的(非Oracle)产品进行维护,Oracle的GraalVM有自己的Javascript实现。