一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4765|回复: 1

JS解释器rhino

[复制链接]
发表于 2017-2-1 11:43 | 显示全部楼层 |阅读模式
在Ubuntu下安装相当容易只要
) T5 m. |1 G$ b1 `sudo apt install rhino 就可以了9 U4 I: L% Q6 j% t1 \9 L: O; W
用vim test.js
+ ^) U$ k& M5 d8 B8 \1 |3 ]print("Hello World");( t4 b, Q1 x. R3 @0 v1 R; x  X
然后用rhino test.js 就OK了) O/ P( S& C9 B% u( G

7 V6 Z7 G( S% p' C0 M- @3 F: c) Q# Y2 K/ G% Y

  W- E% G5 [" }; U
 楼主| 发表于 2017-2-1 11:44 | 显示全部楼层
在网上找来的资料# U  p/ m" w) [5 \# G% ~2 R- p
* E: n! f1 v9 u; Q
# \  X' q% A1 f# m
Rhino -- 基于java的javascript实现  p6 I" o( ?) r& K+ O
2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑
, @; O+ z- D5 m# ]! a* N这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。
* ]( L& L2 X# o& h9 @  b* n' J5 w$ R. J+ a/ ?# Q
Rhino简介1 o2 D  b2 e- V2 C2 ?
(简介这部分是抄的)
* T, x- {6 c" E# |2 P( g, _) L+ W0 e' b, }3 y
Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。9 p5 ~1 {/ L4 V9 y5 v9 P

4 A" ?& J( [( N0 k由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。/ ?- @# j. E' ~. u5 e
* v9 {3 D! c' c, X1 W' X% f
虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。
5 g8 b! j3 k/ v8 K6 I! k( A
6 @: l6 m' ?& m1 t* ~  e如何使用Rhino+ w! {; B/ q& m  ?! j! e% Y
你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。4 G* m  f# ]- k
& V$ U: F  a. x) n
一 console  shell命令% X4 }6 L5 z5 B( y- G
相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。# u" ]0 V1 [- i8 w

/ L4 m4 C# |1 Z+ C# m然后你就可以在命令行中敲打
- u: O, `% l. |; ]# J- A$ [+ c8 F" I+ m$ L- q& @) `/ U
java  org.mozilla.javascript.tools.shell.Main1 L% m: s6 Q0 z1 X2 h
然后你就会看到像这样的输出:
' P5 A) A9 o$ W: S; L  U" {% u, Q, L' s8 Q
Rhino 1.7 release 4 2012 06 18
( P; }! O' b! G1 r% N7 F) m- Djs>
, h1 T- {3 F. u$ v( @; }这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。
% v* q: c% I0 E4 V
8 B3 R, p8 i, o" w$ j) Y直接写代码,效果如下:
6 @* s$ e: _7 r* F
3 I6 T0 @& s) tjs> var a={'name':'zhangwen','age':30}# I% W8 K$ L3 B
js> a.name
+ l- O! H" e! u2 Yzhangwen( _$ D  k$ @( \4 L; H
js> a.age
* u6 l6 v. X# U$ i0 v30
2 C3 ]4 j' n/ v5 x* N, P- [新建一个test.js文件,内容如下:
6 U" ?/ c% x' @2 V% d  i
* @0 u; S- I+ p2 Y6 k5 c0 {function test(str){# P3 H  t2 N! s, p& ~: J
   var name=str;/ o5 [& |  J$ E8 |6 Q
   print(name);+ {  N9 G9 u9 b7 R" Q
}
5 D  G# C% w8 {, ^3 M
7 m" q6 G7 o+ [; G" @) q  D# q) F- c- }8 m
然后在console中输入:
4 w- C3 s( G% `; a# l' `) R+ z; V& {/ ~
js> load('test.js');
5 d) j: j# q3 ijs> test('awen');  " d5 h' v# K/ Q
awen
  ?$ g. R1 i. e+ [8 ~js> * F7 E7 k) g, P- @
体验了这两种方式后感觉是不是很酷?
( I9 e5 _: q' L$ b% L# `3 V& D
0 F1 v# @' i/ h1 e7 o2 |' B# `5 T 9 I: _3 r/ H* W5 i1 u* e' p. V; p" O% Y

* `! a9 K8 @2 z0 g( V' w% t二 Rhino中调用JAVA
" Q2 S- I6 s8 `! j/ e: q( l. Q* s5 \! A# P8 T
不说废话,直接上代码:/ e' p$ x2 A/ W; \# g0 V

6 O. J: P3 l" l) l- hjs> var date=new java.util.Date();
! I# S9 g6 O& N1 _$ q# c- Ijs> date
% g5 h2 P1 l. UMon Jul 16 17:04:07 CST 20129 E  ^' ?$ ^; ~) E+ ?6 i
js> java.lang.Math.PI, X* K  c$ a, _$ R# A
3.141592653589793. C, g0 V& [, |( k8 }
当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。+ h/ p7 K0 q+ u. j4 v& r- U# S4 ]
' t# T6 t- [: ~4 J7 |; W+ J- w
Rhino实现Java接口:
, f+ Y" v1 f0 o5 g7 R
3 i1 X4 R. k; v( C& K/ U$ ?2 g# O' U复制代码. i) f! d9 }% s7 Y) n/ w0 T
js> var obj={run:function(){print("\nrunning...");}}6 D8 z; V& r6 \
js> var r=new java.lang.Runnable(obj);
4 U' H5 }5 C; V6 U% njs> var t=new java.lang.Thread(r);
5 s' f# j! P' v/ tjs> t.start();
7 v. G/ T) d" w: Njs>
1 h2 s3 X: g9 y* k5 y. a- `) ?running...  n# K+ \$ o0 U/ ]; J" O
复制代码
. }3 l7 ?& |1 _" {, YRhino创建Java 数组
3 s  O/ T1 M/ l
/ p: _4 T1 l/ n- Z2 X复制代码" w4 H3 R* b5 L) |' Z: O( T
js> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);  
, d8 `6 Q: Q/ G1 P6 B7 F, _js> array[0]="恩";     5 U9 g0 V7 ?( o4 i+ O
1 ]' A1 x) L6 q& B. j" O
js> array[1]="哦";; b" v" k- J) [9 o! I0 x4 [! j

7 T  r7 O$ n7 |2 ujs> java.util.Arrays.toString(array);
9 n4 ]* B1 u( P7 v, t6 r, o. T[恩, 哦]8 I% @$ F4 w0 U2 ?
复制代码# f) d. B# M* {8 R
三 Java对象操纵JavaScript
$ {+ C" |2 g& _% P) m) A( N6 N5 ]8 M: M
+ F+ E. L; V5 a8 f2 S复制代码
5 b1 Z+ J1 }+ V% bimport org.mozilla.javascript.Context;
  n$ R2 G' W* Oimport org.mozilla.javascript.Scriptable;# r* m5 }1 S; m- W& T( [
* T! ^; {4 D# S' l
public static void main(String[] args) {. O& }. L; _1 C2 B- |
   Context ctx=Context.enter();
+ I0 V4 m* V3 U2 Q6 |+ {% G- o  l8 q   Scriptable scope=ctx.initStandardObjects();' v. y+ Q8 b1 y1 m
   
! ~  i) M/ U0 x# O   String jsStr="100*20/10";7 W* `1 Y8 }% H  ^
   Object result=ctx.evaluateString(scope, jsStr, null, 0,null);
. P, M. k7 G5 d* [# v- [$ {   System.out.println("result="+result);. J1 g; X. L# D1 A- C4 W
}
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-7-13 14:19 , Processed in 0.029747 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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