我知道默认情况下 Java 没有所谓的 eval
(我发音为“evil”)方法。这听起来像是一件坏事——知道你没有很多其他人拥有的东西。但更糟糕的是,似乎被告知您不能拥有它。
我的问题是:它背后的可靠推理是什么?我的意思是,谷歌搜索只会返回大量旧数据和虚假原因——即使有我正在寻找的答案,我也无法从那些只是乱扔通用标记词的人那里过滤掉它。
我对告诉我如何解决这个问题的答案不感兴趣;我可以自己做:
使用 Bean 脚本框架 (BSF)
文件sample.py
(在py
文件夹中)内容:
def factorial(n):
return reduce(lambda x, y:x * y, range(1, n + 1))
和 Java 代码:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("jython");
engine.eval(new FileReader("py" + java.io.File.separator + "sample.py"));
System.out.println(engine.eval("factorial(932)"));
使用像 JLink 这样的设计桥
这相当于:
String expr = "N[Integrate[E^(2 y^5)/(2 x^3), {x, 4, 7}, {y, 2, 3}]]";
System.out.println(MM.Eval(expr));
//Output: 1.5187560850359461*^206 + 4.2210685420287355*^190*I
其他方法
- 使用 Dijkstras 调车场算法或类似算法并从头开始编写表达式计算器。
- 通过委托(delegate)和 HashMultimaps 使用复杂的正则表达式和字符串操作。
- 使用 Java 表达式库
- 使用 Java 表达式语言
- 使用 BeanShell 等符合 JRE 标准的脚本语言。
- 使用 Java 汇编器和下面的方法或直接字节码操作,如 Javaassist。
- 使用 Java Compiler API 和反射。
- 以根用户身份使用
Runtime.getRuntime().exec
最佳答案
“eval”仅在脚本语言中可用,因为它使用运行其余代码的相同解释器;在此类语言中,该功能是免费的且集成良好,因为在脚本环境中,运行字符串或“真实”函数几乎没有区别。
在编译语言中,添加“eval”意味着捆绑整个编译器——这违背了编译的目的。我所知道的编译语言(即使是动态语言,如 ActionScrip3)都没有 eval。
顺便说一句,在 Java 中求值的最简单方法是您忘记提及的方法:JRE 1.6 带有 Javascript 引擎,因此您可以在两行代码中求值任何 Javascript。你甚至可以争辩说你的问题的前提是错误的。 Java 1.6 捆绑了一个非常先进的表达式计算器。
关于algorithm - 为什么人们说 Java 不能有表达式求值器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5285306/