版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-2-1 11:44
|
显示全部楼层
在网上找来的资料
" x1 `% d: U/ m" c, u; i' J V. c7 C8 K. a2 \9 ?2 g
5 X! @( \0 ?+ n7 _' TRhino -- 基于java的javascript实现
9 `1 s: B' D% V( `2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑% ]8 g3 n" }) r) y5 t9 D1 X
这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。) m4 W1 q4 Z' ?: i
! Q/ x- K% n$ _: _0 QRhino简介
4 M! @7 ^; k! _' s3 A) o( ^0 D @(简介这部分是抄的)* J% D' }7 [5 R0 X
# ~. e: `- o3 A6 W$ L. v+ ?; H. d
Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。+ t% l% Y, U! l* P$ g2 t
. K- J) ?* ~* ] E8 w3 v: e5 N3 ]
由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。' B1 L/ v0 t, _
9 _* E/ R6 @6 A! R$ z虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。
9 e- y# A- c0 Y' D" i6 c/ N5 o( x5 `- q3 \
如何使用Rhino9 f" m( }: t) N& x
你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。3 m5 B6 e/ f8 e/ G+ r! J) D! O
- A, R4 X; q; t0 |% J& e一 console shell命令. e ^: {% }/ [+ ]' f
相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。. h: ?, U( z9 P# E' x1 X B4 Y
9 W8 @! p1 Q! a) L
然后你就可以在命令行中敲打$ l( v; r- P7 a( O3 _" W# x
# [5 r1 u, A( @$ @" B, H' B; u
java org.mozilla.javascript.tools.shell.Main
' T# v8 R. l$ h% p9 k然后你就会看到像这样的输出:
- D( ]5 f% ?! D/ U7 O! o' f* f' h- L+ W0 [( t1 H5 ` }
Rhino 1.7 release 4 2012 06 18
; Y3 E ^" O$ n. i( cjs>
2 l: I' D1 m3 N: c! T( q; G这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。# ]8 u' t+ h2 [0 [
: N$ b5 x) y! p直接写代码,效果如下:
# C; c5 [# @5 c2 L6 Q- K( i* a$ _$ v* s1 V) ^2 M0 p- I
js> var a={'name':'zhangwen','age':30}8 R* n( p2 U% [/ \& f& Z- Q& w
js> a.name, Z5 M% Q, N! S9 g) M d1 S- M: r
zhangwen& P `! A% k4 w' V h0 }0 _7 d
js> a.age
) j3 Z9 U6 r5 w+ @6 \30
8 s Q' f) y& T4 ^+ m新建一个test.js文件,内容如下:
$ `8 x7 V& t+ T5 z' g: `/ ]2 |6 D6 H) F' [) ]8 S+ j! j4 ~
function test(str){" f7 r: K- `; j- c- s
var name=str;
8 E/ s U: j" n! c( A print(name);
1 J/ W2 h. o {" ]}
( g0 {+ t3 @/ j$ U & `8 T! Z A( ]5 Y* V
4 V/ B& U3 n8 k' k
然后在console中输入:* i. o" i+ z) i+ e" p1 r
, O9 K( V- T1 q: e S: j6 D4 wjs> load('test.js');
% C- a6 n6 A9 E; ?5 \; n. \ q6 {js> test('awen'); $ x' [1 \; e( r# x9 z
awen/ n+ M% q7 s0 D6 ^- K9 R0 }
js> 0 `6 k t2 L# n/ {! J) I3 L
体验了这两种方式后感觉是不是很酷?* i: h* z7 }, P: y* j
b, l' b$ Z( Q; t N& d* r $ j+ {3 q$ k5 p) v* s; h3 y0 W" r+ }
p' `; @: D5 I) C4 s
二 Rhino中调用JAVA
$ w1 k. t& C2 ?# k, { o6 M
+ u$ I: A$ f3 Y- I不说废话,直接上代码:
3 D2 h2 }' U, O6 o2 e8 w) o7 d3 `& }5 H, S/ Y
js> var date=new java.util.Date();, ~- H6 i, I/ S5 l0 y# [9 o
js> date
8 `# a+ Z1 K3 j* PMon Jul 16 17:04:07 CST 2012, d) D6 A# R/ A x. d" [
js> java.lang.Math.PI
6 x; j8 P* q1 F% z3.141592653589793/ F/ j/ r" v0 H
当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。
9 `, k$ O" I" i2 ]' q6 ]% h: O$ }/ u; G. r7 @4 F) R/ d u1 p
Rhino实现Java接口:6 {, i8 e; D$ M4 o! G+ |/ ]2 Q
8 V' u0 t, m( @2 \复制代码
0 c7 }. r, p# j" D& x6 Y" ejs> var obj={run:function(){print("\nrunning...");}}
$ r; ^* E( ~, {+ y' H1 s kjs> var r=new java.lang.Runnable(obj);5 q9 F, e7 m& G0 M) W
js> var t=new java.lang.Thread(r);6 D: t1 K9 g$ y' [5 j- z
js> t.start();8 a. I3 `7 o6 d9 X, j
js>
4 f2 B- F2 q2 v% p* H% xrunning...# z. y# b- w' i; y
复制代码8 L! L9 ~% P0 g5 }5 g4 m: o
Rhino创建Java 数组( H @- {7 b1 `' Z( K8 T9 ]/ o
- |+ S( A j0 o& }6 c2 H
复制代码
" k( N1 \/ I/ f& I0 ]# V, m! } y* ?js> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);
; t! @0 {( ^6 u; ~1 ajs> array[0]="恩"; 4 _" @' J( F. \1 h
恩
5 O7 X U$ b2 H1 ~3 pjs> array[1]="哦";5 a1 m! P* |. L* l5 @
哦- u4 Z9 k' p) Y& E2 c7 j4 O
js> java.util.Arrays.toString(array);/ d" w4 Q1 q- D. Q% E8 }
[恩, 哦]
+ R0 [4 R6 H, ?1 h复制代码
9 n- ?3 G5 w7 L2 Z2 u8 L6 M# I& p2 }三 Java对象操纵JavaScript* H, N# q, {1 z: ?0 q3 ^- p0 a
' m: g& f; L' ?5 E `1 ?, u
复制代码; s" S/ p! p( {5 y4 r6 g! g" p7 o
import org.mozilla.javascript.Context;% O& g! v0 @$ j9 y. j. c. s3 l
import org.mozilla.javascript.Scriptable;, `1 j# T* q. b
7 x7 Z$ E8 `0 ]. Y( qpublic static void main(String[] args) {# r' p1 i/ {3 Q `/ i* `
Context ctx=Context.enter();
# C/ i0 g# x2 q5 d9 b Scriptable scope=ctx.initStandardObjects();2 S: X; Z0 Q& `( e* `
; @ n( p2 N* K f/ y- p( |% m4 ~ String jsStr="100*20/10";0 q( [7 g) W8 S7 V) B" G
Object result=ctx.evaluateString(scope, jsStr, null, 0,null); 6 Z6 ?' Q3 ~) T1 p
System.out.println("result="+result);
! H4 U/ O" d0 }4 j# a} |
|