龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

深入浅出Rhino:Java与JS互操作(1)(3)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
3. Rhino如何实现Java接口 JavaScript当中,方法本身就是对象。下面我们通过JavaScript语法{propertyName: value}声明一个JavaScript方法,并调用该方法如下: js obj ={

3. Rhino如何实现Java接口

JavaScript当中,方法本身就是对象。下面我们通过JavaScript语法{propertyName: value}声明一个JavaScript方法,并调用该方法如下:

  1.  js> obj = { run: function () { print("nrunning"); } }  
  2.  [object Object]  
  3.  js> obj.run()  
  4.  running 

现在我们构造一个JavaScript对象,实现Runnable接口。并将该对象作为参数,构造一个新的线程,并启动该线程。

  1.  js> r = new java.lang.Runnable(obj);  
  2. adapter1@291aff  
  3. js> t = new java.lang.Thread(r)  
  4. Thread[Thread-0,5,main]  
  5. js> t.start()  
  6. js> 
  7. running 

最后的js>提示符与新线程的打印输出running的先后顺序是随机的,取决于线程的调度策略。

从后端的处理流程来讲,Rhino首先为Runnable接口的实现类生成Java字节码文件。然后调用JavaScript对象定义的Run方法。

4. Rhino如何创建Java 数组

Rhino使用Java的发射机制生成数组。下面是生成2个String对象的代码:

  1.  js> array = java.lang.reflect.Array.newInstance(java.lang.String, 2);  
  2. [Ljava.lang.String;@a20892  
  3. js> array[0] = "Double"  
  4. Double  
  5. js> array[1] = "Life"  
  6. Life  
  7. js> array[0] + array[1]  
  8. DoubleLife  
  9.  js> 

5. Rhino如何捕获与处理异常

与Java类似,Rhino使用try...catch关键字处理异常。

  1.  js> function classForName(name) {  
  2. try {  
  3. return java.lang.Class.forName(name);  
  4. } catch (e if e.javaException instanceof java.lang.ClassNotFoundException) {  
  5. print("Class " + name + " not found");  
  6. } catch (e if e.javaException instanceof java.lang.NullPointerException) {  
  7. print("Class name is null");  
  8. }  
  9. > > > > > > > > 
  10. js> classForName("NonExistingClass");  
  11. Class NonExistingClass not found  
  12. js> classForName(null);  
  13. Class name is null 

6. Rhino如何调用js文件

当然,除了在命令行的方式,我们还可以使用操纵JavaScript文件。下面是一段JavaScript代码,主要目的是判断该数是否为质数。代码如下:

  1. function isPrime (num)  
  2. {  
  3. if (num <= 1) {  
  4. print("Enter an integer no less than 2.")  
  5. return false  
  6. }  
  7. var prime = true 
  8. var sqrRoot = Math.round(Math.sqrt(num))  
  9. for (var n = 2; prime & n <= sqrRoot; ++n) {  
  10. prime = (num % n != 0)  
  11. }  
  12. return prime  
  13. }  

我们保存文件为C:isPrime.js。然后我们需要调用load方法加载该脚本。最后,我们可以调用isPrime方法来判断是否为质数。

  1. js> load("C:/isPrime.js")  
  2. js> isPrime(33);  
  3. false  
  4. js> isPrime(31)  
  5. true 

需要注意的是,注意:文件分隔符需要调整,是“/”而不是“”。

上述部分示例可以参见Rhino官方网站https://developer.mozilla.org/en/Scripting_Java。另外examples目录下很多例子都值得参考与学习。

刚才使用JavaScript操纵Java对象。接下来我们看看如何使用Java程序访问JavaScript

Java对象操纵JavaScript

下面是一段Java代码,用来运行数学表达式。代码如下:

  1. package com.example;  
  2. import sun.org.mozilla.javascript.internal.Context;  
  3. import sun.org.mozilla.javascript.internal.Scriptable;  
  4. publicclass Test {  
  5. publicstaticvoid main(String[] args) {  
  6. Context cx = Context.enter();  
  7. try {  
  8. Scriptable scope = cx.initStandardObjects();  
  9. String str = "3/(1+2)";  
  10. Object result = cx.evaluateString(scope, str, null, 1, null);  
  11. System.out.println(str + "=" + Context.toNumber(result));  
  12. } finally {  
  13. Context.exit();  
  14. }  
  15. }  
  16. }  

运行Java com.example.Test,输出结果如下:

3/(1+2)=1.0

之所以是1.0而不是1,是因为Context.toNumber(result)返回的类型为double。另一个值得注意的是,这里import的package属于JDK 6.0。因此,在不需要Rhino提供的js.jar,该程序仍能独立运行。

虽然Rhino作为JavaScript运行时,功能非常强大,但在性能上却无法与其他的JavaScript运行时(比如Google Chrome的V8 JavaScript Engine)相提并论。值得注意的是,JRuby专家Charles Oliver Nutter也开始参与Rhino项目中,以提升Rhino JavaScript运行时的速度,进而实现与V8的竞争。而Oracle在对JVM上的JavaScript改进与优化,我们有理由期待,在未来,新一代JavaScript运行时Nashorn的速度将会得到极大的提升。

参考资料:http://www.mozilla.org/rhino/

原文:http://tech.it168.com/a2011/1110/1271/000001271695_all.shtml

精彩图集

赞助商链接