转自: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已经把它收归帐下,成了正规军。
- 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
- {
-
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)
- {
-
- 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);
- }
-
-
js 代码
java 代码
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
分享到:
相关推荐
《深入浅出Rhino:Java与JS互操作》是一本专注于探讨如何在Java环境中使用Rhino JavaScript引擎进行交互的书籍。Rhino是Mozilla基金会开发的一个开源JavaScript解释器,它完全用Java编写,使得JavaScript能够在Java...
标题中的“Java调用JavaScript代码”是指在Java程序中执行JavaScript脚本,实现跨语言通信。这主要通过Java的ScriptEngine接口和其相关的API来实现,这些API位于Java的javax.script包中。ScriptEngine接口提供了执行...
Rhino脚本引擎可以嵌入Java应用程序中执行,其最大的特点是脚本的修改不需要重启Java虚拟机(JVM)就能生效,这使得它非常适合在需要频繁更新和测试的场景中使用。Rhino的优势在于它的简单、灵活性以及强大的功能,...
除了执行简单的脚本,我们还可以在Java中调用JavaScript函数。首先,我们需要将函数定义到JavaScript环境中,然后通过`Invocable`接口来调用: ```java engine.eval("function greet(name) { return 'Hello, ' + ...
这意味着开发者可以在JavaScript脚本中调用Java类库,或者在Java程序中执行JavaScript代码。 2. **兼容ECMAScript规范**:Rhino遵循ECMAScript第三版(ES3)标准,尽管它不支持最新的ES6或更高版本的特性,但在处理...
在Java中使用JavaScript,官方指南主要介绍的是在Java平台标准版中嵌入和使用JavaScript脚本语言的官方指导。这通常意味着使用Java代码来调用JavaScript,并且允许JavaScript在Java应用程序内部执行。具体的知识点...
在Java中调用JavaScript,可以使用ScriptEngineManager来创建一个特定的ScriptEngine实例,例如用于执行JavaScript的Nashorn引擎。以下是一个简单的示例: ```java import javax.script.ScriptEngineManager; ...
虽然Execute Java Script步骤主要用于JavaScript,但通过使用`rhino`引擎,也可以执行Java代码。你可以将Java代码写入到脚本字段中,然后在Kettle运行时执行。这种方式适用于简单或临时性的Java代码,对于复杂的...
JWR,全称Java Wrapper for JavaScript,是一个库,它提供了一种更简洁的方式来在Java中调用JavaScript代码。通过JWR,开发者可以将JavaScript对象封装为Java对象,反之亦然,使得两者之间的数据交换更加便捷。 5....
使用JavaScript脚本在Java中的基本步骤可以概括如下: 1. 编写JavaScript脚本:首先,需要编写JavaScript代码,比如定义一个函数来调用Java对象的方法。 示例JavaScript代码: ```javascript function script...
通过上述步骤,我们可以创建一个功能完备的JavaScript脚本调试器,利用Rhino的强大力量和JavaFX的出色界面设计,为开发者提供了一个在Java环境中调试JavaScript的高效工具。这样的工具对于开发复杂的JavaScript应用...
这篇博客(博文链接已提供)将介绍如何在Java中执行JavaScript代码,这主要得益于Java的脚本引擎API。 Java 6引入了JSR 223(Java Scripting API),使得开发者能够在Java应用程序中嵌入和执行各种脚本语言,包括...
在Ant构建过程中,JavaScript脚本方法的使用是一个强大的工具,它允许开发者自定义构建过程,实现更复杂的逻辑和任务自动化。Ant是一个Java库和命令行工具,它的设计目标是驱动软件构建过程,尤其是在Java项目中。这...
",展示了如何在Java中使用Rhino执行简单的JavaScript。 Rhino还提供了`Context`类,它提供了更底层的API来控制JavaScript环境的各个方面,如错误处理、优化级别等。此外,Rhino支持动态加载JavaScript文件,这样...
### BSF(Java中使用JavaScript) #### 一、BSF简介 BSF(Bean Scripting Framework,豆脚本框架)是Apache的一个项目,它提供了一种机制,使得开发者能够在Java应用中集成各种脚本语言,如JavaScript、Python、...
在Java 6版本中,引入了对脚本化语言的支持,特别是通过内置的JavaScript解释器(如Rhino),使得JavaScript可以直接与Java对象交互,执行诸如设置属性、查询状态和调用方法等操作。这一特性极大地扩展了JavaScript...
4. **全局Java对象**:在Nashorn中,`java`、`javafx`和`javax`等Java包被暴露为全局对象,可以直接在JavaScript中使用。 5. **脚本API**:Java 8引入了`javax.script`包,提供了ScriptEngine接口,使得在Java应用中...
5. **脚本编写和执行**:Rhino提供了ScriptEngine接口,这是Java Scripting API (JSR 223)的一部分,使得开发者可以方便地在Java程序中执行JavaScript代码,处理脚本编写和执行的各种需求。 6. **Rhino的API**:...