我在计算产品价格时遇到这个问题,但由于营销计划,折扣,税收,公式几乎每天都在变化......
所以我认为如果我能编写下面代码这样的代码会很棒,这样我就可以在运行时更改脚本。
public BigDecimal calculate(String script) {
return (BigDecimal) ScriptEngine.execute(script);
}
有没有办法用Java实现这个?
答案 0 :(得分:3)
是:使用Scripting API。
有些实现可以运行用JavaScript,Groovy,Python和许多其他语言编写的脚本。
<强> [编辑] 强>
因为评论中提到过:警惕安全问题。
有几种选择:
选项#3不起作用(=仅适用于最简单的情况)。有一个数学证据表明,如果没有实际执行计算机程序,计算机程序就无法告诉其他程序可能做什么。
如果你不允许调用方法(或者只是非常非常有限的一组方法),那么你可以使用选项#3。但是大多数脚本语言都允许访问Java类,这意味着最终可以获得System.exit()
或Runtime.exec()
。这反过来意味着你必须编写一个解析器,确保代码不包含奇怪的东西。
您必须每天更新,因为客户会想出新的......错误的有趣的方式来使用该功能。
也有可能你会犯错误 - 解析器不会接受有效输入,也不会让恶意代码通过。鉴于问题的复杂性,机会在99.9999%和100%之间。
选项#1表示根本没有安全性,但在第三次更改后,客户会责备您采用它。它会工作一段时间,直到第一个脚本儿童出现并破坏一切。猜猜那将是谁的错?聘请他的侄子的经理......孩子?
因此,人类将不得不关注脚本,修复其中的所有错误并配置系统来运行它们。选项#2也会引起各种各样的悲伤,但是考虑到所有因素,它会减少悲伤。
答案 1 :(得分:1)
您希望“脚本”使用哪种语言?
这样做的一种方法是使用Javascript,并使用像Rhino这样的库。这将允许您执行一些JS并在代码中获取输出。
答案 2 :(得分:0)
当然,请参阅Mozilla Rhino
答案 3 :(得分:0)
您可以使用beanshell.jar - 它也是一个独立的shell,但可以很容易地用于在运行时运行未编译的Java代码。