转自:http://www.iteye.com/topic/87423

前段时间,在浏览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已经把它收归帐下,成了正规军。

publicclassMathEval

{

publicstaticvoidmain(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);

doubleres = 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 代码

functionisPrime (num)

{

if(num <= 1) {

print("Please enter a positive integer >= 2.")

returnfalse

}

varprime =true

varsqrRoot = Math.round(Math.sqrt(num))

for(varn = 2; prime & n <= sqrRoot; ++n) {

prime = (num % n != 0)

}

returnprime

}

如何运行呢:

1:在命令行下键入:

java org.mozilla.javascript.tools.shell.Main

2:在js〉下键入:

load("D:/eclipse-workshop/rhinoExample/src/isPrime.js");

注意:是“/”而不是“\”

3:键入:

isPrime(77);

可看见返回结果为false。

键入:

isPrime(71);返回true

再给个例子,脚本如下:

person = {

name:"Mike Squillace",

age:37,

position:"software engineer",

getFirstName:function() {returnthis.name.split(" ")[0]}

}

person.getFirstName()

js产生swing的例子:

load("D:/eclipse-workshop/rhinoExample/src/SwingApplication.js");

怎么样?看见效果没?是不是很强悍?其中SwingApplication.js是rhnio自带的例子。

Rhino还有一个js脚本的调试器:

Rhino JavaScript Debugger:

java org.mozilla.javascript.tools.debugger.Main [options] [filename.js] [script-arguments]

只须运行java org.mozilla.javascript.tools.debugger.Main,就可以看到调试器的界面了。

为了加快js文件运行的速度,可以把它编译为class文件:

compile:

java org.mozilla.javascript.tools.jsc.Main D:/eclipse-workshop/rhinoExample/src/FirstCompile.js

编译产生FirstCompile.class文件

在D:/eclipse-workshop/rhinoExample/src/下运行该class文件:

java FirstCompile

二:在实际应用中不可避免的需要遇到java代码如何和javascript脚本相互访问的问题:

这是一个最简单的例子:(liveConnect.js是rhnio自带的例子):

load("D:/eclipse-workshop/rhinoExample/src/liveConnect.js");

在给个复杂点的例子, 没有什么逻辑,纯技术展示,呵呵:

JSFunction.java:

java 代码

packageco.test;

importorg.mozilla.javascript.Function;

publicclassJSFunction//extends ScriptableObject

{

privateString name;

privateFunction handle;

publicvoidsetHandler(Function func)

{

this.handle = func;

}

publicFunction getHandler()

{

returnthis.handle;

}

publicJSFunction(String s)

{

this.name = s;

}

publicstaticvoidprint(String s)

{

System.out.println(s);

}

publicString getName() {

returnname;

}

publicvoidsetName(String name) {

this.name = name;

}

}

JSExploration.java:

java 代码

packageco.test;

importjava.io.FileReader;

importjava.io.LineNumberReader;

importorg.mozilla.javascript.Context;

importorg.mozilla.javascript.Function;

importorg.mozilla.javascript.Scriptable;

publicclassJSExploration

{

privateContext cx;

privateScriptable scope;

publicJSExploration()

{

this.cx = Context.enter();

this.scope = cx.initStandardObjects();

}

publicObject runJavaScript(String filename)

{

String jsContent =this.getJsContent(filename);

Object result = cx.evaluateString(scope, jsContent, filename,1,null);

returnresult;

}

privateString getJsContent(String filename)

{

LineNumberReader reader;

try

{

reader =newLineNumberReader(newFileReader(filename));

String s =null;

StringBuffer sb =newStringBuffer();

while((s = reader.readLine()) !=null)

{

sb.append(s).append("\n");

}

returnsb.toString();

}

catch(Exception e)

{

// TODO Auto-generated catch block

e.printStackTrace();

returnnull;

}

}

publicScriptable getScope()

{

returnscope;

}

publicstaticvoidmain(String[] args)

{

String filename = System.getProperty("user.dir") +"/jsmap.js";

JSExploration jsExploration =newJSExploration();

Object result = jsExploration.runJavaScript(filename);

Scriptable scope = jsExploration.getScope();

Scriptable obj = (Scriptable) scope.get("obj", scope);

System.out.println("obj.a == "+ obj.get("a", obj));

Scriptable b = (Scriptable) obj.get("b", obj);

System.out.println("b[0] == "+ b.get(0, b));

Boolean flag = (Boolean) scope.get("flag", scope);

System.out.println(flag);

Scriptable myobj = (Scriptable) scope.get("obj", scope);

Boolean myflag = (Boolean) scope.get("flag", scope);

System.out.println(myflag);

Scriptable jsFunction = (Scriptable) scope.get("jsFunction", scope);

Function fc = (Function) jsFunction.get("handler", jsFunction);

Object isPrime = fc.call(Context.getCurrentContext(), jsFunction, fc,newObject[] {"this is my test"});

}

}

js脚本:jsmap.js

js 代码

varswingNames = JavaImporter();

swingNames.importPackage(Packages.java.lang);

swingNames.importPackage(Packages.co.test);

obj = {a:1, b:['x','y']}

next = isPrime

flag = isPrime(5)

with(swingNames) {

System.out.println("in javascript");

JSFunction.print("in JSFunction");

jsFunction =newJSFunction("lichunlei");

varname = jsFunction.getName();

System.out.println("get name from java source: "+ name);

jsFunction.setHandler(log);

}

java.lang.System.out.println("not use swingNames");

functionisPrime (num)

{

java.lang.System.out.println("in isPrime(num)");

if(num <= 1) {

java.lang.System.out.println("Please enter a positive integer >= 2.")

returnfalse

}

varprime =true

varsqrRoot = Math.round(Math.sqrt(num))

for(varn = 2; prime & n <= sqrRoot; ++n) {

prime = (num % n != 0)

}

returnprime

}

functionlog(msg)

{

java.lang.System.out.println("in function log: "+ msg);

}

js 代码

java 代码

声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。

java rhino 运行 js_使用Rhino在Java中调用Javascript脚本相关推荐

  1. java 调用js脚本_Java中使用JavaScript脚本的方法步骤

    简介 Nashorn Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引 ...

  2. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  3. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  4. 在Spark Scala/Java应用中调用Python脚本,会么?

    摘要:本文将介绍如何在 Spark scala 程序中调用 Python 脚本,Spark java程序调用的过程也大体相同. 本文分享自华为云社区<[Spark]如何在Spark Scala/ ...

  5. 教你如何在Spark Scala/Java应用中调用Python脚本

    摘要:本文将介绍如何在 Spark scala 程序中调用 Python 脚本,Spark java程序调用的过程也大体相同. 本文分享自华为云社区<[Spark]如何在Spark Scala/ ...

  6. 【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )

    文章目录 前言 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 a ...

  7. java多线程运行结果写入文件错误java.io.IOException: Stream closed

    今天在写多线程程序的时候,需要将每个线程运行的结果写入同一个文件,用的是FileWriter,最后在关闭写入流的时候出现如下问题: java.io.IOException: Stream closed ...

  8. java程序运行5步骤_浅析Java程序的执行过程

    一 .jdk内容概述 当安装好jdk后(本示例jdk版本为11.0.1,不同版本,目录有细微差别,但bin目录包含的exe是一样的),打开bin目录,有两个重要的exe文件:javac.exe(编译器 ...

  9. java 执行javascript_说说如何在 Java 中执行 JavaScript 脚本

    Java 是强类型的静态语言,即所有的代码在运行之前都必须先进行严格的类型检查并编译为 JVM 字节码.这样做虽然保证了安全与性能,但却牺牲了灵活性.而那些动态语言(JavaScript .Pytho ...

最新文章

  1. 一个Git项目多个仓库
  2. Unity3d Time的使用
  3. 关于c++静态类的说法
  4. Jmeter之BeanShell
  5. 如何有效申请TI的免费样片
  6. 在android添加数据采集,一种基于Android系统的地理信息数据采集方法与流程
  7. javascript中addEventListener与removeEventListener
  8. 值得推荐的WEB版报表工具-报表设计器
  9. windows.h 详解
  10. CentOS 编译运行 DPDK 19.11 流程
  11. Python量化资源大合集
  12. 服务器XP系统打印机共享设置,WinXP系统网络打印机怎么设置?WinXP打印机共享设置方法...
  13. java 修改exif_java – 操作图像而不删除其EXIF数据
  14. 设计模式——使用TypeScript实现代理模式
  15. 海尔全球十一连冠背后: 生态时代的无限游戏
  16. UCSC genome browser 个人track 安装
  17. arch linux简体中文,Locale (简体中文)
  18. 使用免费绿色工具chfs,将文件夹共享成网盘
  19. 毕业论文文献引用方法
  20. python微信抢红包神器_快过年啦,还怕手速慢,我用Python自动抢红包!

热门文章

  1. linux TTY子系统 --- bug来了,稍候再整理
  2. Vue自定义组件——自定义下拉框
  3. CSDN原创文章审核不通过怎么办
  4. UVA 340 猜数游戏
  5. 视频通话会议系统EasyRTC报certificate signed by unknown authority错误解决方案
  6. Nginx重定向与反向代理
  7. R语言随机波动率(SV)模型、MCMC的Metropolis-Hastings算法金融应用:预测标准普尔SP500指数...
  8. 运动防水耳机哪个牌子好?防汗运动耳机推荐
  9. C++缘分测试,来测测你和“她”的缘分(仅娱乐)
  10. 杂谈——探秘字节流与字符流