在运行时在Java程序中执行脚本

时间:2011-09-01 12:19:20

标签: java

我在计算产品价格时遇到这个问题,但由于营销计划,折扣,税收,公式几乎每天都在变化......

所以我认为如果我能编写下面代码这样的代码会很棒,这样我就可以在运行时更改脚本。

public BigDecimal calculate(String script) {
   return (BigDecimal) ScriptEngine.execute(script);
}

有没有办法用Java实现这个?

4 个答案:

答案 0 :(得分:3)

是:使用Scripting API

有些实现可以运行用JavaScript,Groovy,Python和许多其他语言编写的脚本。

<强> [编辑]

因为评论中提到过:警惕安全问题。

有几种选择:

  1. 您允许最终客户提供脚本(例如在网络表单中)
  2. 您不允许客户提供脚本;如果脚本需要更改,则管理员或开发人员必须启动特定工具。
  3. 您开发的系统只允许执行“安全”脚本
  4. 选项#3不起作用(=仅适用于最简单的情况)。有一个数学证据表明,如果没有实际执行计算机程序,计算机程序就无法告诉其他程序可能做什么。

    如果你不允许调用方法(或者只是非常非常有限的一组方法),那么你可以使用选项#3。但是大多数脚本语言都允许访问Java类,这意味着最终可以获得System.exit()Runtime.exec()。这反过来意味着你必须编写一个解析器,确保代码不包含奇怪的东西。

    您必须每天更新,因为客户会想出新的......错误的有趣的方式来使用该功能。

    也有可能你会犯错误 - 解析器不会接受有效输入,也不会让恶意代码通过。鉴于问题的复杂性,机会在99.9999%和100%之间。

    选项#1表示根本没有安全性,但在第三次更改后,客户会责备您采用它。它会工作一段时间,直到第一个脚本儿童出现并破坏一切。猜猜那将是谁的错?聘请他的侄子的经理......孩子?

    因此,人类将不得不关注脚本,修复其中的所有错误并配置系统来运行它们。选项#2也会引起各种各样的悲伤,但是考虑到所有因素,它会减少悲伤。

答案 1 :(得分:1)

您希望“脚本”使用哪种语言?

这样做的一种方法是使用Javascript,并使用像Rhino这样的库。这将允许您执行一些JS并在代码中获取输出。

http://www.mozilla.org/rhino/

答案 2 :(得分:0)

当然,请参阅Mozilla Rhino

答案 3 :(得分:0)

您可以使用beanshell.jar - 它也是一个独立的shell,但可以很容易地用于在运行时运行未编译的Java代码。