前段时间,在浏览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)

}

return prime

}

如何运行呢:

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 () {return this.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 代码

package co.test;

import org.mozilla.javascript.Function;

public class JSFunction  //extends ScriptableObject

{

private String name;

private Function handle;

public void setHandler(Function func)

{

this.handle = func;

}

public Function getHandler()

{

return this.handle;

}

public JSFunction(String s)

{

this.name = s;

}

public static void print(String s)

{

System.out.println(s);

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

JSExploration.java:

java 代码

package co.test;

import java.io.FileReader;

import java.io.LineNumberReader;

import org.mozilla.javascript.Context;

import org.mozilla.javascript.Function;

import org.mozilla.javascript.Scriptable;

public class JSExploration

{

private Context cx;

private Scriptable scope;

public JSExploration()

{

this.cx = Context.enter();

this.scope = cx.initStandardObjects();

}

public Object runJavaScript(String filename)

{

String jsContent = this.getJsContent(filename);

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

return result;

}

private String getJsContent(String filename)

{

LineNumberReader reader;

try

{

reader = new LineNumberReader(new FileReader(filename));

String s = null;

StringBuffer sb = new StringBuffer();

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

{

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

}

return sb.toString();

}

catch (Exception e)

{

// TODO Auto-generated catch block

e.printStackTrace();

return null;

}

}

public Scriptable getScope()

{

return scope;

}

public static void main(String[] args)

{

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

JSExploration jsExploration = new JSExploration();

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, new Object[] { "this is my test" });

}

}

js脚本:jsmap.js

js 代码

var swingNames = 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 = new JSFunction("lichunlei");

var name = jsFunction.getName();

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

jsFunction.setHandler(log);

}

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

function isPrime (num)

{

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

if (num <= 1) {

java.lang.System.out.println("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)

}

return prime

}

function log(msg)

{

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

}

java rhino import_java调用javascript :js引擎rhino相关推荐

  1. java如何调用网页_如何使用网页开发自己的app,在网页中的按钮与自己的java代码绑定来实现打电话即javascript代码调用java代码,和java代码来调用javascript代码...

    1首先是如何在自己的app里用网页显示,这样可以较快的更新界面而不需要让客户端升级,方法如下: xml文件: android:layout_width="fill_parent" ...

  2. java rhino 运行 js_使用Rhino在Java中调用Javascript脚本

    转自:http://www.iteye.com/topic/87423 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式. 结果方案五花八门: 1.jakarta com ...

  3. 去做海外,无数深坑-第一次使用java调用javascript,第一次调用curl

    工作很多年了,发现互联网有着很多以前从来没听过的名词,真是尴尬啊. 前端时间,产品经理提出 [埋点],当时我就有点懵圈,这是啥玩意.后来请求了android的姑娘,大致意思就是我们的操作上报第三方,由 ...

  4. 什么?java中居然可以执行js代码了?真是不知者不怪

    今天在书上看的,java中可以直接调用js的函数了,言外之意就是java已经支持外部的脚本语言了(在运行期解释执行的),查了查,jdk从1.6之后开始支持的,1.6之前不可以. 为什么Java这种编译 ...

  5. Java8 新特性 -- Lambda表达式:函数式接口、方法的默认实现和静态方法、方法引用、注解、类型推测、Optional类、Stream类、调用JavaScript、Base64

    文章目录 1. Lambda表达式 1.1 Lambda表达式语法 1.2 Lambda表达式示例 1.3 说明:函数式接口 2. 方法的默认实现和静态方法 3. 方法引用 3.1 方法引用示例 4. ...

  6. rhino java api demo_javascript与java的相互调用,纯java的javascript引擎rhino(转载)

    1.下载Rhino安装包,下载地址:官网http://www.mozilla.org/rhino. 2.rhino环境配置,把解压出来的js.jar文件加入到系统的环境变量classpath 3.在命 ...

  7. java js引擎,Java8 Nashorn JavaScript引擎

    使用Java8,Nashorn大大提高了JavaScript 引擎引入,以取代现有的Nashorn Java脚本引擎.Nashorn提供2至10倍更好的性能,因为它直接编译代码在存储器,并传递到字节码 ...

  8. java犀牛是什么意思_深入浅出Rhino:Java与JS互操作

    2011年10月6日,一年一度的JavaOne大会隆重举行.JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition).标准版(SE ...

  9. rhino 调用 java_rhino-java中调用javascript

    在有些情况下需要在java里面执行javascript,这时rhino就可以帮忙了.mozilla的一个开源产品. 之前的一篇博客http://my.oschina.net/yybear/blog/1 ...

最新文章

  1. sql中varchar(n),nvarchar(n) 长度性能及所占空间分析
  2. 查linux有哪些task_Java面试手册:Linux高频考点
  3. 江夏学院计算机,福建江夏学院计算机作业.doc
  4. $(function(){}) 与(function(){})()在执行时的优先级
  5. 多媒体文件格式之TS
  6. 数据库兼容级别对数据备份还原的影响
  7. sklearn自学指南(part56)--朴素贝叶斯
  8. Ubuntu下将Sublime Text设置为默认编辑器
  9. 万字长文|深度剖析Service Mesh服务网格新生代Istio
  10. # 电脑管家_如何彻底关闭电脑上的“恶心小广告”?联想电脑管家一步到位!...
  11. 洛谷——P1317 低洼地
  12. node.js(五)项目创建管理
  13. 分享一个简单唯美的404页
  14. python破解Excel文件密码
  15. cisco ios enable password与enable secret设置详解
  16. 关于如何解决启动Kali报错问题
  17. HDOJ 6082 度度熊与邪恶大魔王
  18. 学习笔记转汉字区位码查询与算法
  19. 比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm中的应用
  20. 【Linux】页表的深入分析

热门文章

  1. CSS导航条菜单:带小三角形
  2. Elasticsearch 参考指南(介绍)
  3. C Primer Plus 第5章 运算符、表达式和语句 编程练习及答案
  4. 图像处理------应用卷积一实现噪声消去
  5. 怎样一步一步删除(linux amp; UNIX)环境下 oracle 11g 集群节点
  6. Grid_Oracle Grid Infrastructure概念介绍(概念)
  7. win2000输入密码后循环登陆,不能进入用户桌面
  8. Win32程序开发流程--《深入浅出MFC》
  9. Android Activity 以及 Application 生命周期
  10. JS简单循环遍历json数组的方法