日期:2014-05-16  浏览次数:20426 次

纯java 的javascript引擎:rhino

前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式。
结果方案五花八门:
1.jakarta commons JEXL.
2.Beanshell
3.Java Math Expression Parser jep
4.parse combinator jparsec
5.jdk 6.0的 script
6.利用SQL
7.自己写语法分析
如果自己写语法分析,没有个2000行估计搞不定。有人用sql来运行数学表达式,比较另类。
不过由于前段时间较深入的学习了一些java的javascript引擎,我给出的方案就是用javascript来计算了。
java中比较著名的js引擎当属mozilla开源的rhino,不过jdk6已经把它收归帐下,成了正规军。

  1. public?class?MathEval ??
  2. { ??
  3. ????public?static?void?main(String[]?args) ??
  4. ????{ ??
  5. ????????Context?cx?=?Context.enter(); ??
  6. ????????try??
  7. ????????{ ??
  8. ????????????Scriptable?scope?=?cx.initStandardObjects(); ??
  9. ????????????String?str?=?"9*(1+2)"; ??
  10. ????????????Object?result?=?cx.evaluateString(scope,?str,?null,?1,?null); ??
  11. ????????????double?res?=?Context.toNumber(result); ??
  12. ????????????System.out.println(res); ??
  13. ????????} ??
  14. ????????finally??
  15. ????????{ ??
  16. ????????????Context.exit(); ??
  17. ????????} ??
  18. ????} ??
  19. }??

下面总结一下前段时间学习rhino的心得(给自己的程序添加脚本功能,其实是很酷的):

一:环境配置及运行js脚本:
在 http://www.mozilla.org/rhino/ 下载rhino:
把js.jar加入系统CLASSPATH中
可以以交互模式调用js解释器:
java org.mozilla.javascript.tools.shell.Main
然后您应该会看到解释器的版本号,后面跟着提示符 js>
用法如下:
比如:有一个js文件:
D:\eclipse-workshop\rhinoExample\src\isPrime.js
内容如下:

js 代码
  1. function?isPrime?(num) ??
  2. { ??
  3. ????if?(num?<=?1)?{ ??
  4. ????????print("Please?enter?a?positive?integer?>=?2.") ??
  5. ????????return?false??
  6. ????} ??
  7. ???? ??
  8. ????var?prime?=?true??
  9. ????var?sqrRoot?=?Math.round(Math.sqrt(num)) ??
  10. ???? ??
  11. ????for?(var?n?=?2;?prime?&?n?<=?sqrRoot;?++n)?{ ??
  12. ????????prime?=?(num?%?n?!=?0) ??
  13. ????} ??
  14. ???? ??