版主
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-2-1 11:44
|
显示全部楼层
在网上找来的资料
$ G. @2 |( o4 \2 J+ {8 |5 |
) @5 { K/ O8 W& }# a' U) N- A$ n- e# _3 A8 y
Rhino -- 基于java的javascript实现
8 s% g7 c( z( `. E0 [2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑$ v+ b( s+ z6 Y+ v- e+ u
这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。) W) w; d) ~2 b. N; W8 s
1 D, f8 a2 I$ d
Rhino简介
9 q% i$ U- F1 {$ C/ U, E(简介这部分是抄的)5 C1 ]# ~. z7 _
/ m- `+ r3 ]7 R/ {% i [
Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。
( U/ E7 x! e; F' X. O$ \- [7 h/ a% x2 W) C* k
由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。
' V' k# A/ h; _4 F9 s7 P1 f+ k9 H+ W' _6 L2 X. k
虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。
/ z/ w: @9 W1 b
* z f7 X5 n [* A如何使用Rhino
1 K8 s2 m5 p( H( E# B你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。
! ]9 _1 v7 F a
& @9 D. v0 e' V' Q/ M: _, \一 console shell命令
" X. a: S2 E! j2 H$ |6 W3 X相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。 V! g7 ~% v$ b' l/ A
& x9 Y; A- R6 u1 Z6 W; G
然后你就可以在命令行中敲打' I! `7 V0 c7 G5 o" w
& F' z c* M" S, @1 c5 |
java org.mozilla.javascript.tools.shell.Main. s6 h1 B( O4 G _" y* R6 N
然后你就会看到像这样的输出:
7 n% C: a8 s' f: Q- j' |2 X/ b, x
Rhino 1.7 release 4 2012 06 18
8 P4 k1 s0 j+ ~6 W+ d& m* e; ]; Tjs>
0 o0 v0 E2 B1 Z1 C6 M: R9 a! S这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。& ~+ }% f; \6 T- k( `
4 w6 F$ b3 ^* R2 v" w: d
直接写代码,效果如下:9 e; @, W+ ^( Y) h
$ O7 c* @, D- W9 x4 ^
js> var a={'name':'zhangwen','age':30}% g0 v9 p/ n$ d6 k
js> a.name
1 @2 ]( D4 j0 G H- R/ }$ Tzhangwen
8 t9 Q. v- W/ |; x- b0 sjs> a.age
5 h' C: d- `: z" z30( t* G. r) {4 h: o2 H; Z+ V) N* Q9 R
新建一个test.js文件,内容如下:8 |% x) U2 H( S
# W, @( V4 H% R
function test(str){* F- @4 `8 _( V6 s+ [+ f
var name=str;
6 K! W* I: ?' D |. b# i print(name);' s5 X, b% N6 \" x! {2 U: R. K
}2 S& V( |, u0 Y+ Y
# E8 s8 _2 B* ?. j+ b" a! S
1 a8 j. s' }8 q i" t
然后在console中输入:
, t( a1 x) M3 l: c0 R
5 q$ H) e' ]+ yjs> load('test.js');
4 o3 ?7 N% j& z# s6 v: @4 V6 G+ kjs> test('awen'); + p# W. G3 k' b9 W2 \
awen- P. g1 G4 x" ?7 Q& |$ w
js>
7 n1 v/ z% q' r7 |* O9 H体验了这两种方式后感觉是不是很酷?" L4 o; {. C. Z2 Q5 _) `1 I
: T5 a% D- X( v' ~8 a * T/ ?) [% m4 e1 |5 C: v* C/ s( `
# |; N5 P' K. h" [8 \
二 Rhino中调用JAVA- G* j: O5 E {6 N6 w
) z! E/ v* _) X3 X( k" k不说废话,直接上代码:
" y8 F% s& y. C. D
. X7 J* W! g3 tjs> var date=new java.util.Date();' u$ `/ i. `; \6 y3 H9 N
js> date
" D5 i# o* X9 eMon Jul 16 17:04:07 CST 2012
6 O$ S/ b' j+ g- a* O* n/ u: y tjs> java.lang.Math.PI. q: s* b5 s9 K3 q* j6 X
3.1415926535897938 g3 y6 z8 R6 S/ G
当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。
1 M4 ~3 ?8 v" {1 k
S/ P6 n. v; w6 M a7 [ Rhino实现Java接口:/ g/ v0 l7 j$ z: R0 S9 V h3 B
, |3 s- Y& E+ R8 m2 k* _4 f
复制代码
$ i/ n' s2 e" D! q& e/ Pjs> var obj={run:function(){print("\nrunning...");}}& S" I b9 q a! G
js> var r=new java.lang.Runnable(obj);8 b/ q: s! R' Q0 _$ o
js> var t=new java.lang.Thread(r);- j5 p' Y$ X! Q- A2 [
js> t.start();
& q) n. G3 X+ a0 bjs>
7 B' ^; t+ T5 v, I7 qrunning...
7 ~- n$ R1 N/ l2 e- |4 L复制代码& K* p4 P7 r0 R @
Rhino创建Java 数组 M* x* A0 P+ i# j$ t: m% `! {
+ ? H6 ^% t$ E- v
复制代码. u+ ?1 D' M' e$ j# l9 u$ d( P/ B
js> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2); 1 z6 a- U \7 c6 B- ~- K( Z$ O( D" P
js> array[0]="恩"; ! g+ ]: L u- e4 S
恩
) d9 O5 |# x1 e F; S0 gjs> array[1]="哦";% |9 }# q4 \( i9 ~
哦
5 _6 H- l- \4 K3 J) T, Djs> java.util.Arrays.toString(array);. o/ Y @- `3 T6 G, v
[恩, 哦], B. t/ L2 U; }; F% Y
复制代码/ Q$ c) K' g; f0 S" l
三 Java对象操纵JavaScript, c1 C; ~) V) T( x" c
5 B' n3 J4 h9 G3 D7 c M# B
复制代码
2 V2 O8 X, }5 r; ^import org.mozilla.javascript.Context;
+ a% I4 ^ i3 v0 _# n5 W9 rimport org.mozilla.javascript.Scriptable;
% F( m' ]; |& N% M; N5 O
# y) V0 b& S( n* lpublic static void main(String[] args) {+ K) B' q9 C& `* Y: w
Context ctx=Context.enter();5 `$ m5 o8 `! m E( h
Scriptable scope=ctx.initStandardObjects();7 m' J4 M1 @: l3 O: U$ L+ ]
' d% L5 t; g* C: j! { String jsStr="100*20/10";6 n, Z$ |6 p3 A* ~8 E+ a2 e
Object result=ctx.evaluateString(scope, jsStr, null, 0,null);
! Z8 x" e5 R0 v' V7 U System.out.println("result="+result);
# H5 C- S+ I4 G5 e1 R; `} |
|