一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2398|回复: 1
收起左侧

JS解释器rhino

[复制链接]
发表于 2017-2-1 11:43 | 显示全部楼层 |阅读模式
在Ubuntu下安装相当容易只要
& o% Y# Y1 P( Y1 h% X; d. vsudo apt install rhino 就可以了
: Y3 p$ E  j; G用vim test.js
: _: N9 ?0 T  R: pprint("Hello World");
. z8 x3 z) j% _. V8 W5 e* p然后用rhino test.js 就OK了
/ ]: u( L/ t; X5 T7 [
! h- Q3 V; f* Z' o2 G; o* G) t4 S- k# r4 I, p0 N; L# W  H

6 z1 K; I3 ^% G' I9 D$ h. W
 楼主| 发表于 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; `}

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-2 13:09 , Processed in 0.046683 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表