纯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已经把它收归帐下,成了正规军。
- public?class?MathEval ??
- { ??
- ????public?static?void?main(String[]?args) ??
- ????{ ??
- ????????Context?cx?=?Context.enter(); ??
- ????????try??
- ????????{ ??
- ????????????Scriptable?scope?=?cx.initStandardObjects(); ??
- ????????????String?str?=?"9*(1+2)"; ??
- ????????????Object?result?=?cx.evaluateString(scope,?str,?null,?1,?null); ??
- ????????????double?res?=?Context.toNumber(result); ??
- ????????????System.out.println(res); ??
- ????????} ??
- ????????finally??
- ????????{ ??
- ????????????Context.exit(); ??
- ????????} ??
- ????} ??
- }??
下面总结一下前段时间学习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 代码
- function?isPrime?(num) ??
- { ??
- ????if?(num?<=?1)?{ ??
- ????????print("Please?enter?a?positive?integer?>=?2.") ??
- ????????return?false??
- ????} ??
- ???? ??
- ????var?prime?=?true??
- ????var?sqrRoot?=?Math.round(Math.sqrt(num)) ??
- ???? ??
- ????for?(var?n?=?2;?prime?&?n?<=?sqrRoot;?++n)?{ ??
- ????????prime?=?(num?%?n?!=?0) ??
- ????} ??
- ???? ??