日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

java rhino import_java调用javascript :js引擎rhino

發(fā)布時(shí)間:2025/5/22 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java rhino import_java调用javascript :js引擎rhino 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前段時(shí)間,在瀏覽javaeye論壇,看見(jiàn)有人征集如何在java中運(yùn)行數(shù)學(xué)表達(dá)式。

結(jié)果方案五花八門(mén):

1.jakarta commons JEXL.

2.Beanshell

3.Java Math Expression Parser jep

4.parse combinator jparsec

5.jdk 6.0的 script

6.利用SQL

7.自己寫(xiě)語(yǔ)法分析

如果自己寫(xiě)語(yǔ)法分析,沒(méi)有個(gè)2000行估計(jì)搞不定。有人用sql來(lái)運(yùn)行數(shù)學(xué)表達(dá)式,比較另類。

不過(guò)由于前段時(shí)間較深入的學(xué)習(xí)了一些java的javascript引擎,我給出的方案就是用javascript來(lái)計(jì)算了。

java中比較著名的js引擎當(dāng)屬mozilla開(kāi)源的rhino,不過(guò)jdk6已經(jīng)把它收歸帳下,成了正規(guī)軍。

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

}

}

}

下面總結(jié)一下前段時(shí)間學(xué)習(xí)rhino的心得(給自己的程序添加腳本功能,其實(shí)是很酷的):

一:環(huán)境配置及運(yùn)行js腳本:

在?http://www.mozilla.org/rhino/?下載rhino:

把js.jar加入系統(tǒng)CLASSPATH中

可以以交互模式調(diào)用js解釋器:

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

然后您應(yīng)該會(huì)看到解釋器的版本號(hào),后面跟著提示符 js>

用法如下:

比如:有一個(gè)js文件:

D:\eclipse-workshop\rhinoExample\src\isPrime.js

內(nèi)容如下:

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

}

如何運(yùn)行呢:

1:在命令行下鍵入:

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

2:在js〉下鍵入:

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

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

3:鍵入:

isPrime(77);

可看見(jiàn)返回結(jié)果為false。

鍵入:

isPrime(71);返回true

再給個(gè)例子,腳本如下:

person = {

name:"Mike Squillace",

age:37,

position:"software engineer",

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

}

person.getFirstName()

js產(chǎn)生swing的例子:

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

怎么樣?看見(jiàn)效果沒(méi)?是不是很強(qiáng)悍?其中SwingApplication.js是rhnio自帶的例子。

Rhino還有一個(gè)js腳本的調(diào)試器:

Rhino JavaScript Debugger:

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

只須運(yùn)行java org.mozilla.javascript.tools.debugger.Main,就可以看到調(diào)試器的界面了。

為了加快js文件運(yùn)行的速度,可以把它編譯為class文件:

compile:

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

編譯產(chǎn)生FirstCompile.class文件

在D:/eclipse-workshop/rhinoExample/src/下運(yùn)行該class文件:

java FirstCompile

二:在實(shí)際應(yīng)用中不可避免的需要遇到j(luò)ava代碼如何和javascript腳本相互訪問(wèn)的問(wèn)題:

這是一個(gè)最簡(jiǎn)單的例子:(liveConnect.js是rhnio自帶的例子):

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

在給個(gè)復(fù)雜點(diǎn)的例子, 沒(méi)有什么邏輯,純技術(shù)展示,呵呵:

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

}

總結(jié)

以上是生活随笔為你收集整理的java rhino import_java调用javascript :js引擎rhino的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜视频在线免费播放 | 精品一区二区在线看 | 蜜桃臀aⅴ精品一区二区三区 | 午夜精品在线免费观看 | 妞妞影视 | 日韩欧美黄色片 | 天天宗合网 | 第一福利在线视频 | 奇米影视一区二区三区 | 中文字幕在线日本 | 麻豆蜜桃av | 亚洲国产视频在线观看 | 亚洲图色av| 日本一级做a爱片 | 一个色在线 | 成人黄色在线 | 国产污污视频在线观看 | 国产精成人品 | 美腿丝袜一区二区三区 | 国产成人精品国内自产拍免费看 | 成人一区二区三区视频 | 五月激情片 | www.美色吧.com | 婷婷激情五月 | 亚洲一区二区三区在线视频观看 | 国产一区二区三区四区三区四 | 亚洲免费国产 | 国产99精品视频 | 欧美视频直播网站 | 成年人理论片 | 精品国产aⅴ一区二区三区四川人 | 久久精品激情 | 国内久久精品 | 97免费超碰 | 成年人一级片 | 亚洲欧美视频在线播放 | 日韩精品一二三四区 | 国产在线视频一区二区三区 | 黄色片网站大全 | 久久婷香| 欧美成人精品三级网站 | 久久免费播放视频 | 日韩一区二区不卡视频 | 免费观看成年人视频 | 四虎精品视频 | 亚洲一久久| 香蕉视频网站入口 | 日韩av在线中文字幕 | 四虎免看黄 | 久久无码国产视频 | 99国产精品久久久久久久久久久 | 国产视频欧美 | 韩国女主播裸体摇奶 | 国产乱人乱偷精品视频a人人澡 | 日韩一区二区三区免费 | 福利电影在线播放 | 97精品人妻一区二区三区 | 国产日本欧美在线观看 | 欧美精品观看 | 亚洲h视频在线观看 | 樱花影院最新免费观看攻略 | 中国在线观看片免费 | 91视频分类 | 欧美人妻少妇一区二区三区 | 国产爽爽视频 | 亚洲一一在线 | 黄av网| 森泽佳奈中文字幕 | 免费看的黄色录像 | 蜜桃视频成人在线观看 | 久久青青 | 色综合久久88色综合天天免费 | 欧美激情自拍偷拍 | 中文字字幕在线观看 | 久久无码视频网站 | 黄色免费看片 | 成人免费视频久久 | 日韩精品成人免费观看视频 | 日韩欧美在线播放 | 亚洲色精品三区二区一区 | 中文字幕不卡 | 男女裸体无遮挡做爰 | 免费在线观看视频 | 色婷婷基地 | 亚洲一区二区三区国产 | 吃瓜网今日吃瓜 热门大瓜 色婷在线 | 亚洲人精品 | 国产成人精品在线视频 | 在线碰 | 肥婆大荫蒂欧美另类 | 日韩 欧美 亚洲 国产 | 亚洲综合免费观看高清完整版 | 五月天丁香激情 | 泽村玲子在线 | av 日韩 人妻 黑人 综合 无码 | 国产高清自拍一区 | 丰腴饱满的极品熟妇 | 国产精品久久婷婷六月丁香 | 老妇高潮潮喷到猛进猛出 |