一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4094|回复: 1

JS解释器rhino

[复制链接]
发表于 2017-2-1 11:43 | 显示全部楼层 |阅读模式
在Ubuntu下安装相当容易只要
/ [6 w6 T1 Y6 O2 Z; @; ]5 Csudo apt install rhino 就可以了' b' ?# l. P6 J
用vim test.js( F* B4 u6 U. I! J4 v( e  c" J
print("Hello World");8 \/ k/ I+ z5 q8 {" h
然后用rhino test.js 就OK了7 Q+ B/ _" ^( v/ k9 Y# g
9 W) L9 {" }/ w5 r4 [/ x
; W# R1 D8 c, d5 d1 _

7 C1 z4 M* {# w; }) p* F
 楼主| 发表于 2017-2-1 11:44 | 显示全部楼层
在网上找来的资料$ D- _- i* ^; h+ C" h

. h) K' Q, t& A$ g" Q
  s  i+ s  Y' X5 f2 XRhino -- 基于java的javascript实现7 y8 p; D, v! I/ i/ Z
2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑' w2 k* A4 g! l
这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。
, ?5 w- m9 [. I) Y$ L
9 c3 ]  U4 n3 s4 T2 ^Rhino简介  i) B; M+ a4 q/ y$ i8 L+ M6 s, X1 F- R
(简介这部分是抄的)9 f' J& d- v8 |, t- [6 z
" m& f1 m* @2 H
Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。
0 M; R8 P8 z/ `6 ^2 L
& p+ H! l9 v! v9 v2 I由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。5 S; Y! t$ F' O; {" _* m! Y

; p3 A8 ?5 X' \/ P7 o+ v' O4 I$ o虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。1 U. N  I. l! I: n; S3 ?& _
2 k7 O9 A% {0 Q( m/ w; o
如何使用Rhino$ K+ {  U- }8 k+ R
你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。7 E: ?4 I9 N; K

9 B9 B3 O3 L( p) a9 m* H! ~# C一 console  shell命令
8 t1 p  q# L, ?6 @2 z! X相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。; g0 |3 R) \6 |% s
, k: l) ]# V/ P2 ~- z/ m9 M
然后你就可以在命令行中敲打
, b) J0 z5 V" `8 u( `) m" G
* U. \0 z5 i" Qjava  org.mozilla.javascript.tools.shell.Main% d- x9 c4 e; O- F. W
然后你就会看到像这样的输出:4 A' P' Y/ X5 G# g+ G

- L6 l- @2 Q, [# j4 [Rhino 1.7 release 4 2012 06 188 Y7 f% _/ F( v& m
js> 1 D+ g% s5 f% D  I: G
这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。
7 b$ l5 B# k' t9 v2 @) D, F0 D* k7 ^3 i
直接写代码,效果如下:
& T  @! h. p( s" e. |  y
- i5 |: s* v6 Q% g- W! h  djs> var a={'name':'zhangwen','age':30}' F2 ^9 S. B* W0 i1 U
js> a.name
% Y5 @+ d# S9 l# lzhangwen: w: h) P  ?) r3 i$ N5 J# c
js> a.age3 T6 @% e: F  f, s' w+ `
30! G6 X, k( }( F& @
新建一个test.js文件,内容如下:! I8 C& r2 u2 v) q$ R2 g3 {( Z
+ ]( `. ^( f! e1 @: @0 D/ Z
function test(str){
' h/ @% n; K2 @) d; v& R4 B8 t4 L   var name=str;
" @0 F7 O+ s& R   print(name);2 b+ C7 J% p5 u" D- _& H! g
}  e- f0 ]" S! U4 r# H
, r8 I6 B! p5 Q' K# S1 Z/ y

8 {3 m" a  f3 P5 L7 ], D/ W% N然后在console中输入:
" z2 `) w! q' C7 S6 X* A- c& P% v! u
js> load('test.js');8 I( `; ?8 }$ v- v" K$ i/ l
js> test('awen');  * L! F- z6 u$ n
awen  z$ E  ~/ j( S9 y
js>
2 B) f7 g3 p/ O4 S+ @体验了这两种方式后感觉是不是很酷?
5 I9 g" K" ^: w4 W" G) o; g
. w& l: D( P. F- q2 n
$ q$ N$ \+ B2 e$ `* n3 T) u  q  D2 }
二 Rhino中调用JAVA) M# k& e1 V/ g

3 \% {; E% b) ]" Y1 r不说废话,直接上代码:
1 W4 C. D- E' M$ @0 D! Q/ B
# [4 j* D- K% X, Z0 cjs> var date=new java.util.Date();, q3 u1 d: e2 B3 _2 b
js> date
6 U% J. ~, ~/ e: A6 Z" [Mon Jul 16 17:04:07 CST 2012) n8 c5 U9 {4 ~- V! [! o  N/ r
js> java.lang.Math.PI! I! U  [: m: o; k4 i
3.141592653589793
+ `6 j! @; z4 z5 N: \" M# h当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。
: D- r# I0 q  _, ]# G# A- Q- }9 f$ P
Rhino实现Java接口:
( \; n7 T* @7 Z1 M7 G& E3 ^! [: p  v: A8 N2 O
复制代码
' R1 c2 G  A7 _9 s$ ~7 K2 Rjs> var obj={run:function(){print("\nrunning...");}}
6 X4 e- U. c1 {% g5 X4 Zjs> var r=new java.lang.Runnable(obj);0 K$ K* S6 r9 g9 {; M! S
js> var t=new java.lang.Thread(r);
- T; v/ Q' s2 L* Cjs> t.start();  V" T- ^, C- [$ B; X7 ~
js> : F: j6 Y: i2 R3 ?% E
running...0 \" t/ d" K1 w  i  J4 Q; p* Z
复制代码/ X" P+ @' ~* ^* n' V% W" R0 s
Rhino创建Java 数组
4 K4 f( D0 z1 @: j6 C9 O; d' E; p9 U1 A$ N7 M
复制代码' r- ]! T) N! Z8 }& W! R) X
js> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);  / p; M: O& l& R% y. \0 F' m- ]0 w
js> array[0]="恩";     2 _- Q( x: j/ T* ]+ \

' Z8 |$ g: V* O3 ~: mjs> array[1]="哦";8 a" N+ O# h; s, g5 i; _6 g7 D

" p7 @' q3 t& T5 q8 j* Gjs> java.util.Arrays.toString(array);1 n/ O4 j( K+ Y$ F6 v/ \+ ^
[恩, 哦]
7 c- z6 [) ?, @+ H复制代码- i- H' D7 b/ k: \
三 Java对象操纵JavaScript
2 R5 Y0 u/ L. M6 [  F3 w; ?7 B2 P" {. |2 j1 p# ^" T) ~
复制代码
: d3 a* ~2 k& m/ Mimport org.mozilla.javascript.Context;4 p& J0 O. G0 {1 L4 d, N, T: j
import org.mozilla.javascript.Scriptable;
5 r- z3 L0 `( p' c! p! @4 N! `0 V; U- x
public static void main(String[] args) {
2 ?+ j/ I+ o$ M   Context ctx=Context.enter();
% E1 _6 f. n! j8 @   Scriptable scope=ctx.initStandardObjects();, n5 j# M4 c( ]" _" O; q: o; L
   
2 q2 C& K5 m6 b2 l& O3 M- ?   String jsStr="100*20/10";% b: e4 N! @  ?# n$ w6 m3 }
   Object result=ctx.evaluateString(scope, jsStr, null, 0,null); 8 y. ?* A6 b4 h# W, {& i
   System.out.println("result="+result);
' Z1 {! H3 I8 k* Y/ w}
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-10-29 23:10 , Processed in 0.029380 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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