版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-2-1 11:44
|
显示全部楼层
在网上找来的资料
/ ?0 x) x/ d' @* W" d4 h: L: E8 G+ j& O/ F7 d
; U+ \; @3 _# N! y M4 ZRhino -- 基于java的javascript实现) l# M! {) U* b+ Q
2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑
7 {; ]5 k% T2 D/ K; q" B! E这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。
$ t3 K$ `+ `; k; L! ~
+ X! G7 ^. m- L- T/ tRhino简介- q9 `3 ~: o/ l* N7 s* U) L
(简介这部分是抄的)
5 F1 i; D u# S! X6 b* f7 E
0 n. R7 v% I/ a rRhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。2 o' T3 ?( \- |
' d1 f3 L( _/ Q0 Y. N' ~8 e( C; H由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。+ S; A. v7 c4 s
7 u* N! A8 P: _1 R+ J+ ?; x
虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。
* H8 E; J D8 |( ^5 A7 Q& j# r- C" I2 z# z7 p
如何使用Rhino
( W! S. W. N8 q" N% R, o8 M$ ~. l你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。' z8 t7 p& c8 S/ A' L; |/ \% f
) I' O* q; T3 F9 x* e0 o: x# L一 console shell命令
$ x* Y) N, q h9 e% E2 I相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。& `: w/ s i' J2 T7 i
; e( C. v( H; H6 ^9 [
然后你就可以在命令行中敲打8 N% a/ Y# H# n; w. ^. e
2 y! m* ~: j" Rjava org.mozilla.javascript.tools.shell.Main
% a* ?$ T+ o* x S9 T然后你就会看到像这样的输出:
4 D# g7 q" U$ P G4 ^: o, x/ W7 o! I p
Rhino 1.7 release 4 2012 06 18
9 B* j6 t5 G' ~' L9 `8 ljs> + F6 J( e- d' Z9 m% T% v
这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。
& H. v+ U; A* ^3 e$ P G
+ f8 P, w; y2 g2 ]直接写代码,效果如下:
3 z/ k& I% w9 ]
' O. [7 |- v. t- U. `' z: \js> var a={'name':'zhangwen','age':30}
3 p A' }9 K' R" U0 f" Zjs> a.name
8 e" q! A! [' i2 qzhangwen: O+ {# X7 y8 e
js> a.age/ n: [# U9 u: l3 c" B% W* K+ a' i
30+ [, i" ]8 S& E: a7 |& [8 z
新建一个test.js文件,内容如下:$ D* J, k# C1 O& v/ [
4 w' j( V' @* }( U$ @1 Qfunction test(str){
4 j& s2 ]3 [0 ^; e9 |/ N var name=str;
$ h' n: [ I0 F" J! o$ E3 K. c print(name);
( Y/ s I2 h8 e$ N* y}
; q9 T6 C! i( @4 d& J+ m2 p9 I
0 d5 {% d5 x2 |+ O; J" g* @2 r0 k1 _
. d( e8 q2 g5 i6 J; Z/ S3 k然后在console中输入:& B; r/ {. n- ?3 X
6 Y6 E! G( K9 `6 T Z& O' Zjs> load('test.js');
9 V% y0 b' b1 s- z" A9 f3 pjs> test('awen'); . ?) a1 Y% D8 r
awen
: I7 ^7 {4 ]# n; a, n" `js> 4 T9 X4 Y1 [0 K
体验了这两种方式后感觉是不是很酷?
4 n$ P9 c/ s' ]6 h" ?1 M# u$ p9 y7 u C4 Y# a# D7 g
! R1 ?. S) d3 F& d4 j' o
% |$ ^! t6 D: v
二 Rhino中调用JAVA
. u. \' p2 {" d" S3 Y, H# K4 U0 q. L( E1 X' L, p' Q
不说废话,直接上代码:
. O( O3 c: ~0 ?0 r' s" f+ N) v0 Y/ a) R/ |9 M( `
js> var date=new java.util.Date();
) q* _5 H) R" G1 E/ E5 b& cjs> date
, U6 z# `5 H3 C+ |" TMon Jul 16 17:04:07 CST 2012
: R+ q4 T/ M1 \0 q8 F9 U; P cjs> java.lang.Math.PI2 o/ C3 ~* y/ \+ k' w! P( \; A
3.141592653589793; B6 b1 X( s0 S# x( r5 G2 }
当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。( r! ^% a. J! }- z8 f
" N% ^ D) v8 k9 [9 F
Rhino实现Java接口:1 C6 I2 T+ D$ O; D5 S& ~" X
/ W M+ a \" ~+ ^复制代码% i4 A! i! H9 }7 c7 B8 ~' Q
js> var obj={run:function(){print("\nrunning...");}}. Z& R" n \* L8 V1 M8 B
js> var r=new java.lang.Runnable(obj);) [9 b* t& i) l( I. h) p
js> var t=new java.lang.Thread(r);1 b4 S' k. k# O6 W% T* h9 i. r& n+ A
js> t.start();
" `# G/ h6 D G+ q$ b2 l; h$ vjs>
- Y* X$ R: `4 X5 a( M/ T+ a( |0 srunning...
* M4 }% Y5 e( I0 U复制代码& L- Z- Q. @/ K4 @# u7 \
Rhino创建Java 数组
+ r, B0 y6 R& O0 n4 {! O, _9 o8 A$ D
复制代码
@, f0 W% D# W9 D( f4 O2 o) F0 wjs> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);
4 J, N" r( T6 N# P$ g3 Cjs> array[0]="恩";
0 w1 z* r4 p. `9 @恩9 D* q. c' T/ y1 v& P( {, o
js> array[1]="哦";
. }& J( d# O: r3 j哦/ w! u. i% I. S; l9 p8 x( E6 @
js> java.util.Arrays.toString(array);' m, z0 d+ Q1 i' \1 @2 V( k
[恩, 哦]
6 V' \4 I9 Y, N! _" s p T复制代码
( E6 Z) K: p, b5 w, ?. M' K# V三 Java对象操纵JavaScript. r0 B3 T% e: Q* L! N; C
, c b8 ~ H) k9 Y, D3 O复制代码
) A; f, o$ N: E& A& Zimport org.mozilla.javascript.Context;
- F$ {, p; ]; e( [% }import org.mozilla.javascript.Scriptable;
! N: N4 y# ?; x) w4 Z2 |+ E
2 P; g+ e# f. j; H# G5 J7 [# K- ~public static void main(String[] args) {9 D. m4 @ } n- U' k$ T6 O" [
Context ctx=Context.enter();: G: U/ K" r- o, k" [% V
Scriptable scope=ctx.initStandardObjects();
2 ]6 S1 m2 J" n
/ p% w& I% q( W# z7 K String jsStr="100*20/10";
o' v# P& x* l Object result=ctx.evaluateString(scope, jsStr, null, 0,null);
8 Y2 w$ }4 f4 r6 J/ l+ q- z: O' D System.out.println("result="+result);" q( l. F. [2 M" n7 [
} |
|