一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

JS解释器rhino

[复制链接]
发表于 2017-2-1 11:43 | 显示全部楼层 |阅读模式
在Ubuntu下安装相当容易只要
9 W3 O) G( _* E8 lsudo apt install rhino 就可以了
, C( H8 n& o) E& ^用vim test.js
* G4 O: u  K6 {; F1 O* S3 rprint("Hello World");# a( U  k/ H4 t$ v$ ^; s
然后用rhino test.js 就OK了; n3 G2 h4 a" k
$ m/ ?* i! A" Z2 M

+ r/ c$ q9 f6 c3 [7 U$ g3 [0 o! e- D! M# G
 楼主| 发表于 2017-2-1 11:44 | 显示全部楼层
在网上找来的资料4 m7 G- J# b+ F" B* s, p3 y0 C

; Q+ [  h- A" ]: C
! k% M' O+ y/ t# b% @( YRhino -- 基于java的javascript实现
& D( d) [1 Q) V8 Z2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑3 ]! q9 n7 S3 ?$ H; c( }# t
这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。
( a8 D0 }: {; \& W: I
& U1 ^- A5 l4 l. f$ LRhino简介
; S5 ^) a9 q' v7 g" Y* o(简介这部分是抄的)
' D+ r2 b) @: j& N% s( K" V! d7 n0 r. O8 t& ]9 k# d- m
Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。
! J! n& a2 D1 Q7 L# k" F
7 e2 ~+ p$ G6 m  H5 j由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。6 F6 Y3 P0 u6 A' m; R& Z
, t$ Z0 f" R! }5 N; T) d; n! \
虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。
+ {+ \) z8 k! ~0 B/ S' B% V) o9 \
. p5 B- L* i  e如何使用Rhino9 {) v6 R7 I( g5 [( L
你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。, P7 L2 C$ S+ i$ ~! P. K

* N; B9 l7 ~! t* t一 console  shell命令. S8 @: f/ U: D; Z
相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。# Z* h- x" p8 j

7 f( L+ I' y( h9 @/ m( U" i然后你就可以在命令行中敲打
) _! q( ?' m) |7 h& D( `  f  F0 U5 W" H
java  org.mozilla.javascript.tools.shell.Main
7 e# Y5 c, u* ?- W. F然后你就会看到像这样的输出:
) N4 j% m& L$ F( A7 D4 w. d% v$ p! o' Z( U% \; W
Rhino 1.7 release 4 2012 06 18' c6 w' o2 S6 t& y
js>
7 e! U9 T: A; j6 u这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。1 C3 c: ~% g1 m

9 D9 t: V/ n  J! u5 R" @" Y直接写代码,效果如下:+ N# a8 X' A- R# j# \
$ F7 ~0 A6 h! W* w" m; k
js> var a={'name':'zhangwen','age':30}
: H0 j* w. p. hjs> a.name
% A8 V  x$ l( ?9 S& w6 }zhangwen
3 d) \8 N( M) g+ |! djs> a.age* `4 ~( K1 W6 K5 y+ I
30
  [- G, v# V6 _! x; @0 s, s; l8 p新建一个test.js文件,内容如下:6 T7 T) Q, z, f/ ?# v. Y5 T

* d5 N# |2 q  S, Mfunction test(str){+ b/ V, D" ]$ {& N: e
   var name=str;
+ z4 e3 u4 \* d# {  q3 _   print(name);$ l! K. [  ^) ]2 w1 w$ t
}
- z: u8 |* R! F8 y6 F : L" o' s$ o* Y' R" ~' G, B

6 I+ u7 d9 M- Y7 K: A8 C然后在console中输入:0 A" r* U+ S2 w8 z% B6 Z

% @7 Q) V: ]7 Q7 zjs> load('test.js');
: F; [' J: f. S8 cjs> test('awen');  
8 R# `0 j% g: v' q) E  rawen
- ], r1 R& g. u) vjs> + i8 Y: a0 k/ L& f6 O
体验了这两种方式后感觉是不是很酷?
4 ]6 p3 V( K* T2 J: A9 W$ `
' G1 A: H" ^+ | ! h8 z, ^7 m* S8 P6 o
4 Y/ Z  `0 ^9 @' m
二 Rhino中调用JAVA7 @; Z( V1 P  {! O
, ~  m+ O! W/ R* y
不说废话,直接上代码:
+ U) R  s, W4 Q/ D& N% j3 {
3 c- P) ^! Y* ?, Rjs> var date=new java.util.Date();+ F5 U7 Z1 J. D
js> date7 m2 R" e3 T( f4 N6 R
Mon Jul 16 17:04:07 CST 2012
1 O( X0 m' _/ a" f) F7 E7 s/ B& @js> java.lang.Math.PI
5 ~) t0 Z$ M* g8 ~. V) X7 U3.141592653589793! J9 b" F( ~1 y) Q- {1 c; q2 @
当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。6 ?- p* N6 V/ G6 \, \" n0 z) r5 @3 d

( K2 @4 T! [; l) J7 S Rhino实现Java接口:
. f# m" \6 I9 e8 P* C- w* @( Q& F, o
: Q0 ^4 m* ~3 A复制代码
" N8 O& j  a+ _: T. g, pjs> var obj={run:function(){print("\nrunning...");}}7 A7 g* \0 r0 G0 S: d
js> var r=new java.lang.Runnable(obj);
( l* D1 r# h! l$ O1 Xjs> var t=new java.lang.Thread(r);
7 O4 X1 R, j8 ijs> t.start();
# t0 P0 W' A- G5 l7 D  h% s0 njs> $ }9 x; U9 z( b+ ?3 i* x2 m# A! N
running...4 P5 ^" R. t4 }, b" P
复制代码2 a- D: X+ S6 H0 {
Rhino创建Java 数组
7 t" s8 M# u3 R1 b, D- C4 f9 l9 H/ a- H& ]+ l
复制代码" M+ U9 Y- {8 t4 m6 A3 V
js> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);  
9 a! b( W3 ^  |/ p  N1 L3 [js> array[0]="恩";     - G$ N( g) z# [* [
5 P( Q% ~! t2 j! D% R  h( p
js> array[1]="哦";
" Q* D: ]& |9 }0 p6 i4 g7 u$ V! E" m" E5 n2 N8 i! |5 x8 a
js> java.util.Arrays.toString(array);& o! i& D5 H- c' k
[恩, 哦]
+ `) ]- |. H* q$ J7 N$ M. ]5 W复制代码/ z1 W+ u! k2 s! z6 l6 d+ }
三 Java对象操纵JavaScript# z0 M, Q6 U  \  |7 m

9 P) v- ^; }. |5 u* R6 h/ ]复制代码
, j0 ]+ h! _6 _: Ximport org.mozilla.javascript.Context;
0 Z  y' [2 g& T& \9 ^# p; B6 M+ kimport org.mozilla.javascript.Scriptable;
6 }/ Y/ {1 X5 S+ j/ R2 L
, A. S! x( R3 `% gpublic static void main(String[] args) {
- N( ]  i2 _2 D& O* p* u   Context ctx=Context.enter();) V; s1 ?, T! x6 t8 B9 D& `& [
   Scriptable scope=ctx.initStandardObjects();
! y! ]7 D) V5 t- m& Y/ \! k   8 l( n! s8 k& K' N
   String jsStr="100*20/10";
& `! w" I7 p0 t( \" d   Object result=ctx.evaluateString(scope, jsStr, null, 0,null);
/ v6 a  x  v, s& I4 z( \; ~0 @   System.out.println("result="+result);
' j3 f3 N; C5 {( X9 N}

本版积分规则

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

GMT+8, 2025-4-28 04:34 , Processed in 0.045798 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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