转自: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. 单链表建立(头插法,头插法,用数组),求长,插入,删除,输出,释放(递归释放和循环释放),归并(递增和递减)
  2. 【 随笔 】 财源滚滚
  3. Team Leader你会带团队吗?你懂合作吗?你好像都不会啊!(上)
  4. numpy 矩阵乘法_一起学习Python常用模块——numpy
  5. CSLA .Net学习资料
  6. Easy Problem 2 奇妙的数字
  7. CNN-4: GoogLeNet 卷积神经网络模型
  8. php变量前下滑_PHP变量
  9. Linux虚拟机的替代品:Docker与WSL2上手笔记
  10. 16.了解如何把vector和string数据传给旧的API
  11. android的JNI标准 android的NDK
  12. eclipse adt 安卓开发配置
  13. 人口增长模型——基于matlab语言
  14. 有限差分法及matlab实现,有限差分法与matlab实现
  15. 买服务器做网站 镜像选什么,云服务器做网站镜像类型选啥
  16. 接口测试常用文档模板介绍
  17. PostgreSQL中创建空间拓展(创建空间数据库)并连接到空间数据库,导入数据表操作
  18. HEX文件和BIN文件的区别及HEX的代码转换
  19. 关于readyState
  20. Usage of API documented as @since 1.8+ less... (Ctrl+F1) Inspection info: This inspection finds all

热门文章

  1. 向量点乘的图形学意义
  2. JavaScript 箭头函数与function函数区别
  3. idea导出war包(没有使用maven)
  4. linux shell 逻辑判断
  5. 软件测试语句覆盖代码,白盒测试:语句覆盖率测试
  6. linux下的文件可以分为哪五种类型,LINUX系统文件类型分类
  7. Linux学习-快捷键、关机
  8. Mathematica中的PopularCurve手绘卡通图片的可视化
  9. Python高级编程1-python面向对象初识
  10. html内联元素和块元素的特性,HTML中块级元素和内联元素的特性详解