版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-2-1 11:44
|
显示全部楼层
在网上找来的资料
+ P9 a { N: N0 k7 }. p
( p5 W2 Z& J' c) E z
( L: } j3 _$ Y. w' v8 g/ j( ZRhino -- 基于java的javascript实现
* \# N) \$ c3 [' ?/ A. H2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑
3 s$ A) {7 J0 E2 H$ v; I这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。
2 z0 P. s) p5 Q& H" r, E7 c+ d9 X6 W# l8 u# i7 j3 z
Rhino简介
. L0 u8 L* w) ]. H(简介这部分是抄的)
9 C) f: i4 ] M {/ H
$ R9 u2 K4 V/ E; Q1 h3 Z0 }. [Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。
3 H* d3 F' u9 o1 S C* T A/ y* e( w" o4 z3 B! i! ^/ n! O% C$ x
由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。
! r3 K; d9 u9 p8 K
; i W& O6 {+ u5 F* I8 B# p, S6 m虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。* j, s L5 O& ^. N+ C( L9 S2 ]
1 f# P) f2 c3 b1 V9 ] F2 m
如何使用Rhino
" K2 ^: o3 [# x/ `你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。% w1 z3 r' P, g: Y& X" R) [4 Q
3 D( h1 l: s9 o$ R一 console shell命令
' p! t; L( O5 C; i- E相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。
( d9 G- @2 F# Q: Y" P9 z# v) e$ L: o8 }
然后你就可以在命令行中敲打
: h- Q5 U, n- A2 S* }% ^$ p# a* |+ e
java org.mozilla.javascript.tools.shell.Main
0 G( e! d' t. ^* B O然后你就会看到像这样的输出:1 j# G* Q5 n% T: h" U
) z* c- o7 O; V) f% d
Rhino 1.7 release 4 2012 06 18
$ r, |8 L: P. Z: a3 [js> " T! }3 g5 J# e* Q1 e( H
这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。/ _& t3 ?! v1 M6 W9 i. {
- x9 R$ r( l; ?7 g0 t$ F' F F: w直接写代码,效果如下:
4 l* i3 z; l( ~2 G( q- u2 @' J2 O; J- ]1 T" H; N; {
js> var a={'name':'zhangwen','age':30}) R5 N) }8 m: w$ q" R
js> a.name
4 [. P3 E1 [1 e: k3 Hzhangwen# a8 C7 e- K0 w5 P( U- \- I& D$ X
js> a.age
! d8 P/ ^/ l+ e. v7 C0 k: u6 t' `301 |6 l8 K } y8 U- s9 X% p
新建一个test.js文件,内容如下:3 I$ [6 L) S! {) w. v# i
# Z1 Q& U! m/ Z0 V0 ufunction test(str){6 P+ \, C! K3 f/ ^ c6 A0 ~( W
var name=str;: E5 {7 y: m; ?3 d+ Z5 [
print(name);% u K/ P! a2 F9 q% i4 i& k
}; X( T" u6 c0 z8 d0 f* r
( K' ^% z3 n- B. C
! x9 S, y! `4 K' ?' x% R然后在console中输入:
, K4 T! p! {# r, v5 ^8 Q, Q
) m- w6 |& y7 G% Z) t) M& Djs> load('test.js');
# z% P" x8 }& _, k: ljs> test('awen'); 8 g7 U5 q: b2 T# P
awen# T( T. I7 x/ r) w# z5 X8 X6 q0 W4 {
js>
+ `8 P) M/ k+ l体验了这两种方式后感觉是不是很酷?9 z* Y9 a) X, t, D& o# N, o( N6 ?1 s
3 P* x4 J* i: q0 G 0 j& D6 i% k( i; I
5 e+ k3 w5 |* T _/ ]( d! P二 Rhino中调用JAVA
0 g: k1 U3 E5 u% [6 J; Q! n" c. a
不说废话,直接上代码:
* p [& ~! X$ } U* q$ R. |) P
/ k4 L5 L2 x5 l4 \. gjs> var date=new java.util.Date();! d2 D2 A% M9 e+ E5 ?8 D. l
js> date t" e3 h4 L# ~! O5 i0 Z6 K! |& [- I
Mon Jul 16 17:04:07 CST 20121 `8 Z9 N2 |1 s- f; b: ~" h
js> java.lang.Math.PI9 m% w1 L& e1 W$ m- O: D
3.1415926535897934 O9 L; l6 Y( P! \% u3 y5 t
当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。
6 W& }% @" L6 f6 b9 W: O
# [" E( S3 E# m7 C" o& d1 J Rhino实现Java接口:# ~# J A0 v( M+ W
: U+ V1 J' `) k/ P/ t+ o; t
复制代码
O7 j. P+ m2 Z% S. A1 d0 ~js> var obj={run:function(){print("\nrunning...");}}
! c3 e( f. G7 n/ W8 x' `0 Ijs> var r=new java.lang.Runnable(obj);
2 m$ @9 U. E' }5 ]8 ^js> var t=new java.lang.Thread(r);% r" t; k+ `2 }* _/ o
js> t.start();
@$ b& M" y: s! q- ^& G! e6 Sjs>
b/ t o$ ^; g- A& v. grunning...
7 c- @3 `% s+ h复制代码
! t" V# n4 ?: y% aRhino创建Java 数组
! h' e& i! [5 Q0 x6 T+ {! Q# [/ \
复制代码
4 J. Y% y% A) {1 o9 fjs> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);
2 Y; \ e, q. ?$ j( ljs> array[0]="恩";
# B3 l, X6 E% a$ F6 S2 H _4 ~恩' C- g: z. T. @" U
js> array[1]="哦";9 [% I( u0 h2 h" m X
哦, Q: @6 E# ~3 O2 [! y
js> java.util.Arrays.toString(array);
' T# k3 n/ G ][恩, 哦]; D9 V0 a5 N6 E, R+ w& K
复制代码
1 v3 j0 h2 F- h% y/ U4 E' ~三 Java对象操纵JavaScript
6 U" p8 u1 _7 }! S/ m6 _
/ [! c% M5 |% l' s复制代码$ _ h+ U0 C+ W/ ?: a, J1 u/ s
import org.mozilla.javascript.Context;5 E) T' }; S/ e* ~
import org.mozilla.javascript.Scriptable;* t, K' q! k W1 p/ Y% @
) _1 u( `% @. u1 q [1 h0 T
public static void main(String[] args) {' ]' _7 o% f7 G+ L) M6 l; C
Context ctx=Context.enter();
$ f5 M" U/ o1 P3 ? Scriptable scope=ctx.initStandardObjects();, q- z! E$ J5 i+ _! {8 S- l
" O: a) l: z( R: w4 N2 m, Y0 M+ q
String jsStr="100*20/10";
5 A* B; a+ {, d9 W: d Object result=ctx.evaluateString(scope, jsStr, null, 0,null); 2 X3 }* b) j# I
System.out.println("result="+result);: Y7 P" c* j" U% S
} |
|