Java中是否有eval()函数?

我有一个string,如下所示:

String str = "4*5"; 

现在我必须使用string来得到20的结果。

我知道在其他一些语言的eval()函数将这样做。 我怎样才能在Java中做到这一点?

您可以使用ScriptEngine类并将其评估为Javascriptstring。

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

可能有更好的方法,但这个工作。

没有标准的Java类或方法会做你想做的。 您的select包括:

  • select并使用一些第三方expression评估库。 例如JEL或这里列出的六个库中的任何一个。

  • 使用eval方法将expression式封装到Java源代码中,然后将其发送给Java编译器,然后加载生成的编译类。

  • 使用一些可以从Java调用的脚本语言作为expression式评估器。 可能性包括Javascript,BeanShell等。

  • 从头编写自己的expression式求值器。

第一种方法可能是最简单的。 如果您从不信任的用户获得expression式进行评估,则第二种和第三种方法是潜在的安全风险。 (认为​​代码注入。)

很less有真正的用例能够评估String作为Java代码片段是必要的或可取的。 也就是说,如何做到这一点实际上是一个XY问题 :你实际上有一个不同的问题,可以用不同的方式解决。

首先问问自己,你想评估的String是从哪里来的? 程序的另一部分生成了它,还是由用户提供了input?

  • 我的程序的另一部分产生了它 :所以,你想要你的程序的一部分来决定要执行的操作的types,但不执行操作,第二部分执行select的操作。 而不是生成并评估String ,而是根据您的具体情况使用策略 , 命令或构build器devise模式。

  • 它是用户input :用户可以input任何内容 ,包括执行时可能导致程序运行exception,崩溃,暴露应该保密的信息,损坏持久性信息(如数据库内容)等的命令污秽。 防止这种情况的唯一方法是自己parsingString ,检查它不是恶意的,然后评估它。 但是,自己parsing它是被请求的eval函数做的很多工作,所以你没有保存任何东西。 更糟糕的是,检查任意的Java是不是恶意的是不可能的 ,因为检查是停止的问题

  • 它是用户input,但是允许评估的文本的语法和语义受到很大的限制 :没有通用的工具可以轻松地实现一个通用的parsing器和评估器,用于你select的任何有限的语法和语义。 你需要做的是为你select的语法和语义实现一个parsing器和评估器。 如果任务很简单,可以手动编写简单的recursion下降或有限状态机分析器。 如果任务很困难,你可以使用编译器编译器 (比如ANTLR)为你做一些工作。

  • 我只是想实现一个桌面计算器! :一个家庭作业,呃? 如果你可以使用一个提供的eval函数来实现对inputexpression式的eval ,那么这不是一个家庭作业的任务,是不是? 你的程序将是三行。 您的教师可能希望您编写简单的算术分析器/评估器的代码。 有一个众所周知的algorithm, 调车场 ,你可能会发现有用的。

我可以build议你使用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(); 

,你不能在Java(或任何编译语言)中使用通用的“eval”。 除非你愿意编写一个Java编译器和一个JVM 在你的Java程序中执行。

是的 ,你可以有一个库来评估math代数expression式,比如上面的代码expression式。

如前面的答案,Java中没有标准的API。

你可以添加groovy jar文件到你的path和groovy.util.Eval.me(“4 * 5”)完成你的工作。

编写自己的图书馆并不像你想象的那样困难。 这里是分步码algorithm的逐步algorithm完成的链接。 虽然,你将不得不parsinginput令牌的第一个。

还有两个问题可以给你一些信息: 把一个string转换成mathexpression式? 在java中parsingmathexpression式的好库是什么?

JavaSE中没有这样做, 你必须find第三方库或写你自己的。