版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-2-1 11:44
|
显示全部楼层
在网上找来的资料+ }' J$ T# V2 h; J5 G0 r4 X
' E- ?: k# v$ p1 K
; X$ W- }/ z/ r+ v6 ]8 zRhino -- 基于java的javascript实现. n4 L0 v( y8 n! l7 Y$ I- g6 }( }" w% F
2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑
, j( d$ c9 b& W, i这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。
+ L% E. L6 z8 A+ Y3 |2 m. n+ N6 c, {" j. L
Rhino简介
! ~ ?+ Y6 `9 B% e) ?/ Z/ h(简介这部分是抄的)
% z H# e& d& @+ H0 Z8 b) F/ ^! I% I; j. {- l5 X) H
Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。" X( A2 J h) |) V( Y; j" J
- _1 o1 b+ O( a0 ?: r& e# |由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。: Y+ r* Z2 `3 i2 ^2 `0 F
3 c* x+ m9 q7 n- H& k; o虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。
: z7 L; F6 J6 u( w& U5 q( H: F& Q' s0 f# p! l
如何使用Rhino8 L2 Z* ^3 }; |, Y
你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。
$ b9 }: b: g3 \$ ]! W+ W4 E9 q* T; S3 V ]8 y; V4 s
一 console shell命令
F' E0 r5 u% P2 Z o+ ?4 s2 l相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。" C* p) S5 L+ ~& t* `; p+ j
" i% y T# @3 u8 r+ i然后你就可以在命令行中敲打9 N% m$ ] x& w% `- K, P
. |0 `4 I7 m7 z2 z! ujava org.mozilla.javascript.tools.shell.Main
! y1 n+ s% R# c' r3 x5 W然后你就会看到像这样的输出:
0 d! Q _' [' S+ C" j
) r* Z& ?7 V1 B% _1 D" HRhino 1.7 release 4 2012 06 18
! N' [' {3 n6 V. T0 m+ r1 Mjs> # l, V; B D4 L7 a
这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。3 b. z$ w3 h& e
D# R6 v, a: M9 O H% e
直接写代码,效果如下:" O$ @4 W6 w7 k1 `# A
5 L. k( o% p9 A3 ?7 R
js> var a={'name':'zhangwen','age':30}
: r" V2 t6 K2 R7 z9 }js> a.name
1 m6 @: n+ k# D3 p9 K5 Azhangwen
0 ^5 H" [- }3 tjs> a.age' R9 b3 Y* d D
304 r2 F( k3 h+ T- h0 p6 c
新建一个test.js文件,内容如下:
5 B0 u- k6 P' D9 i2 B; b+ r* w, ?( Y5 V8 i0 R3 L5 o. I4 L8 w/ W9 O
function test(str){" Y1 @0 X. ~( V; L) I9 ?
var name=str;% q* s; J. ^' t
print(name);- Q4 Y; n* F" l3 p
}
+ i% s& c+ j9 s: T% W
' X/ W# L* z0 r5 P7 h0 b7 q5 v9 f8 V0 F6 s0 p! F7 P% q
然后在console中输入:
% Q% I! b' T, s0 i X/ E4 s- t. R% ~: t1 ~. y3 a
js> load('test.js');
: H, x4 Y% s. |" n" W: u8 Ojs> test('awen');
. _" J6 W2 n6 bawen9 f) D% B4 B, E5 f
js> 0 G6 a! g7 v! @; {! E8 p' d- v
体验了这两种方式后感觉是不是很酷?/ [( ^. |; `9 j2 d. b+ o; m" E
0 o9 n/ Y' ?. T7 v, ]0 L* ~ # `; }( }' x! Q* b( f2 Z9 L
1 N% N" o. P* Y2 ^4 `) C* |9 r1 c* ]二 Rhino中调用JAVA! ]' S3 P$ Y7 j1 G* Q7 e, V! a
: ~9 z/ u# u: m( Z# N
不说废话,直接上代码:
: j4 ~$ U5 a( ?* v! W/ t- q3 d, v( n; J7 U3 s7 U5 _1 x
js> var date=new java.util.Date();+ U7 T7 |3 `9 L, j1 t% n& G$ w
js> date1 \& T/ }7 S- C2 ^4 L8 r9 R5 m
Mon Jul 16 17:04:07 CST 2012
8 ^" C9 M. P6 f" Hjs> java.lang.Math.PI" K. Q. k. m5 C- z; {8 V- |3 s6 h
3.141592653589793
" x' u- V s8 h0 X9 ?1 G' k: j) b7 N当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。% l& F$ L f- P) Q4 X' U
- a) X5 C6 Q8 ^' _ Rhino实现Java接口:2 N: m/ ?' K! T1 ]) V$ M
# H; d3 P1 X% ?2 ?: b! f复制代码# K9 k9 D% E1 o" d+ {
js> var obj={run:function(){print("\nrunning...");}}; \9 P# f3 r3 w: U/ F
js> var r=new java.lang.Runnable(obj);
$ |5 z: R8 }8 i8 D1 w$ q) fjs> var t=new java.lang.Thread(r);0 Z+ P& n2 ]+ i% Y) c. b3 |
js> t.start();
; l- k! Q! ~# x( |6 E! b) Ojs> # |3 Y c! o, s& G- r) d: @6 q8 }
running...
. Z+ e! `3 i6 y d( X$ U; ?复制代码; K* e) H! v$ t& E$ q( }* N; W
Rhino创建Java 数组
: _- K8 V. d2 @4 B8 F: B3 `% g
7 q7 ~3 M; E; y- `1 V T! u复制代码$ }5 ? H! ~7 {# l5 O F, O
js> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);
$ {$ M9 N$ x% [; u; Xjs> array[0]="恩";
: r' h, { A" U恩
2 Y8 |* _$ Y* I$ g/ ^js> array[1]="哦";
+ X% c1 G0 ?+ [" I5 H4 M哦
5 S1 {0 G* R! h/ [' J+ y9 Njs> java.util.Arrays.toString(array);
! ]! `$ S$ e5 g9 p[恩, 哦]
, e" |" r0 d- b6 b7 R& D* G2 v复制代码$ R4 C, m7 o, b* n
三 Java对象操纵JavaScript
' y$ C* I! a* x- v5 V- [% ~( R! g2 ^) R' _$ V
复制代码
5 S/ B& H6 f& M, Kimport org.mozilla.javascript.Context;
/ y! M, N+ a; N' |# B+ l8 Timport org.mozilla.javascript.Scriptable;8 g- f) t7 }: i/ e8 M; K" t/ c7 y
: E( w ?" M4 b: s$ R
public static void main(String[] args) {
8 N/ G" R- {9 C1 s) w9 H Context ctx=Context.enter();9 S, N+ X" ]- D0 T% ]8 ^
Scriptable scope=ctx.initStandardObjects();: l$ Y5 ? z3 ]# e6 ]1 S* s
% T0 x4 B: w, t7 U String jsStr="100*20/10";
5 ]4 }7 z2 }3 ^; @ Object result=ctx.evaluateString(scope, jsStr, null, 0,null);
) I, T' M2 i% j @ System.out.println("result="+result);
( z! c @' b% B- F1 v" w+ a} |
|