一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4326|回复: 1

JS解释器rhino

[复制链接]
发表于 2017-2-1 11:43 | 显示全部楼层 |阅读模式
在Ubuntu下安装相当容易只要: _, G# f7 H, g: J0 x7 r; n* T5 r
sudo apt install rhino 就可以了7 h3 [/ c' i7 F* b
用vim test.js2 N+ x* b5 N9 {5 j( _1 R
print("Hello World");
3 Z$ a4 J/ i1 Z' {1 F% c+ X$ R( p然后用rhino test.js 就OK了
8 z* F* N5 O7 z" U* |& m$ |1 {
  Z- t/ q2 U; ^" L" G2 N. A! K* y* {/ a) \5 u1 k
; l+ I0 r# \  z. p4 x# N) i
 楼主| 发表于 2017-2-1 11:44 | 显示全部楼层
在网上找来的资料
; a7 u# i2 s/ T$ b. }/ o, t, |3 s( H% ]+ G& F! h; w0 p
5 `) k- _8 @& K6 ~! b% U( R% K" a4 n  S# w
Rhino -- 基于java的javascript实现% g# r# c4 C3 r* ~0 m
2012-07-16 17:42 by cczw, 12081 阅读, 1 评论, 收藏, 编辑
% z. [6 F0 w8 y这几天突然对js引擎非常感兴趣,大概了解了一下,记下来备忘。javascript引擎大家比较熟悉的应该是当前比较火的Chrome V8引擎。以快速闻名。v8基于c++开发。这里就不多阐述了。另外一个是 基于java的Rhino引擎,这个想来大家不是很了解。下面来简单介绍一下。
- ^8 q6 }7 o, f2 {& \. K& ?5 C6 l8 ]  G# O0 b4 X7 b, l
Rhino简介" K  h5 t/ e2 t. A/ N: w3 L4 n! j
(简介这部分是抄的)
# [, u- {% V' x8 V9 Z5 l7 T6 g
6 D( V; z; `9 {( Q  R) D$ xRhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。最为明显的区别是,Rhino 不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法(没有求助于调用存取方法)。; Q3 U& M' M2 J5 Z, g
! j! n. S  h/ M& `7 Y
由于 Rhino 是 JavaScript 的一种基于 Java 的实现,所以对于 Java 开发人员来说,它应该特别易于使用。JavaScript 的(以及 Rhino 的)语法非常类似于 Java 编程语言。这两种语言都采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。: A0 ^0 M  Q% f

8 ?, f9 r' W7 r. P虽然 Rhino 与本系列文章中介绍的其他编程语言具有很多共同点,但对于 Java 平台上的编程而言,它也有独特之处(可能有时有些不同的地方)。Rhino 是一种 基于原型的(prototype-based)语言,而不是一种 基于类的(class-based)语言。在 Rhino 中,您可以构建对象,而不是类。除了类的对象实例之外,这样做还可以让您避免构建和操作类的开发、部署和执行成本。正如您将在文中发现的那样,诸如 Rhino 这类基于原型的语言在开发和运行基于 GUI 的应用程序时尤其有效。0 W+ `, `% q/ l/ G2 ~' Y

% ]! u! X6 q% e9 i如何使用Rhino
0 K% z# G- _" A$ a% R( B: _( L你可以去Rhino的主页下载最新的源代码和文档,解压开之后有一个js.jar 这就是Rhino的库文件。Rhino应用方式我分为console,js调java,java调js三种。下面来一一阐述。* K% T- k! ?9 O* w6 ^

4 H  S! ~- s& |" P9 x" O一 console  shell命令
6 h( b7 b* f# c, o相信很多技术猿们习惯使用酷酷的console控制台来敲打shell命令。可这些一般都是服务端语言。现在你也可以在控制台中敲到js代码了。用法很简单。首先要将js.jar文件放入windows的java\jdk1.6.0\jre\lib\ext目录,mac的 /System/Library/Java/Extensions/目录下。- s9 [, Q0 o9 M! o8 ]' z! L- f
, {; B$ Z4 h& k2 `7 d% h  f
然后你就可以在命令行中敲打
. u7 n1 K) E6 M7 K9 q* U) b' ?& A7 |) v2 ~
java  org.mozilla.javascript.tools.shell.Main
0 [+ M* ]9 L! Q& b然后你就会看到像这样的输出:
- i* F" S) n! Y4 L) L0 A* {: k6 C8 L: U& v, D" ]) i
Rhino 1.7 release 4 2012 06 18( f, }8 w. E" W% D1 S4 i/ y; u: c. ]
js>
8 C" n; u2 Y- @/ J6 e这样你就可以调试js代码了,这里你既可以加载js文件来运行,也可以直接运行js语法语句,并且Rhino借用了java中很多的基础语法,使我们写起代码来更easy。下面我们来试试看。$ r7 V4 Y, @( a' E; [
! |  Y3 L* \2 h8 p9 f
直接写代码,效果如下:4 B% S  @8 K& l0 m6 R2 n+ w2 T/ X. G
) W% H) P$ Q' {1 `. V9 d2 ]; r- |
js> var a={'name':'zhangwen','age':30}
1 J6 x# M( }7 ojs> a.name% `; j* K9 E) G, U7 J
zhangwen1 y- h: ~% V  D3 X. Y
js> a.age" ]0 \& B. i/ f' m
304 d4 h" d4 d' [' V2 J2 a
新建一个test.js文件,内容如下:+ u6 |3 K1 F0 Z
+ E. y9 U" R& L0 U: X  t) x
function test(str){/ a9 K7 t3 q& {% s! n7 _
   var name=str;) O- \. _6 y& k8 l+ ]6 @4 C% k2 T6 Z( ?
   print(name);8 N! w. S' A1 w% d" E( R+ G
}
. y8 D3 X: G: J) | , r. g+ e1 b5 V, }; B5 F5 E

  l9 H* X$ v$ f然后在console中输入:7 [/ A& D! y3 U+ }( V( {6 _& _/ E' w

# R5 _+ g9 C* p/ ]. T, G7 o6 Gjs> load('test.js');6 v8 Z) _1 Z  }+ }8 j3 a% {
js> test('awen');  
6 `3 b4 e! e2 a7 a. K. tawen
9 P. \5 \, N' _! L, W9 V9 J8 ]3 A3 _js>
/ E7 u5 P7 Z2 B8 S+ j7 {体验了这两种方式后感觉是不是很酷?' E. w2 P' j& c3 `4 |( R7 V8 E

$ I8 Q0 f( h# |$ h. Q2 l ) U* M# F1 f  s

0 Q+ R, Z: w% m# z" R# w% l0 B二 Rhino中调用JAVA( u' i+ \- J7 P" N: L; m+ R
% P; B3 z  ~2 f* t9 I. y# ~+ G* m* L
不说废话,直接上代码:
% R0 K" M3 ^3 s9 h$ G6 x$ Z& _. e. K. k8 I# z) D* \
js> var date=new java.util.Date();; @: P: ?. d' G0 M! l1 i
js> date! c: F5 I( M' h2 f6 ~
Mon Jul 16 17:04:07 CST 2012
/ p8 Q8 J& J8 |& k" {js> java.lang.Math.PI9 e* W3 h8 s6 [0 G
3.1415926535897935 m# z. g6 G. m. ^# i5 M( ~
当然,你也先导入包,importPackage(java.util)(相当于java中的import package)那么代码中就不用写类名的包路径了,var date=new Date();不知道细心地同学发现没有。在javascript中也有原生的Date,那这样我们就应该避免这样的写法,防止代码中混乱。
* b6 K/ v. Y+ D0 G" R% g- C9 \+ Q: b# ~- |+ N
Rhino实现Java接口:
+ N  S8 H' K+ {
8 x) t, Y% \8 a0 ^  N复制代码. j! C! I+ T: [/ ]) z
js> var obj={run:function(){print("\nrunning...");}}+ ]1 }. V6 m5 X- m! {
js> var r=new java.lang.Runnable(obj);
4 D) X0 T+ z/ S, h% Hjs> var t=new java.lang.Thread(r);
4 p# l, _3 G3 Djs> t.start();# k8 z, h0 Z- K) |4 t
js>
/ M- o+ G, A7 Z( Rrunning...
5 N7 x7 b( _0 M6 u" A3 A# k复制代码- S5 M$ N: s8 T, `
Rhino创建Java 数组
1 x- G  m! ^4 G+ L8 ~
" s3 X" L. l/ ~: G4 Z6 T) S复制代码* \1 G* Y$ x8 p  \6 O
js> var array=java.lang.reflect.Array.newInstance(java.lang.String, 2);  % Q9 O- G, O  ~
js> array[0]="恩";     / j+ J0 ^/ T5 _7 X
2 z# X, u) w/ _& s- c6 p, R
js> array[1]="哦";
/ m% k* d: u  X* ?* N
/ m) m  O9 n$ X" `7 S; n. i; R2 ajs> java.util.Arrays.toString(array);
/ T% [4 r; b" D+ T4 ?( Q7 d[恩, 哦]
8 }9 I' k0 j) h复制代码
1 V0 n5 c2 e# L, i三 Java对象操纵JavaScript9 M. Q2 Q7 i5 M/ A7 ?$ s
3 J9 X/ ~, a) q) d7 }2 j0 [5 o0 V3 ~
复制代码
9 B) ~7 _8 R( H) P$ A; Q% N' oimport org.mozilla.javascript.Context;: M" @- E* H5 y# H) D
import org.mozilla.javascript.Scriptable;
+ r3 n, L0 u; |
# v4 h3 h  |( N% h1 ~7 ^7 d* |public static void main(String[] args) {: `4 M4 |- T  n% l# X3 c9 X3 D- o
   Context ctx=Context.enter();- @5 u# U1 {/ t5 }+ b& K. \
   Scriptable scope=ctx.initStandardObjects();7 z( H4 J  i- \3 s5 |* ?
   4 \9 E9 k  F. x3 A
   String jsStr="100*20/10";; f1 g( k* n( K9 I* R  J
   Object result=ctx.evaluateString(scope, jsStr, null, 0,null);
5 p. ?1 p' g3 x/ q   System.out.println("result="+result);
, v" O# B4 U2 l}
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-1-11 17:24 , Processed in 0.032234 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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