技术开发 频道

深入浅出Rhino:Java与JS互操作

    【IT168 专稿】在JavaScript中,方法本身就是对象,这一点与Java不同。我们可以通过下列方式查看方法的重载:

js> f.listFiles

  
function listFiles() {/*

  java.io.File[] listFiles()

  java.io.File[] listFiles(java.io.FilenameFilter)

  java.io.File[] listFiles(java.io.FileFilter)

  
*/}

  输出中列出三个重载方法。第一个为无参函数,第二与第三个对应的参数分别为FilenameFilter与FileFilter。

  另一个比较有意思的特点是通过构造for..in,查看对象对应的所有方法与变量。如下:

  js> for (i in f) { print(i) }

  exists

  parentFile

  mkdir

  toString

  wait

  [
44 others]

  这里列出的方法一部分来自于父类,比如wait来自父类java.lang.Object。

  对于JavaBean,Rhino也提供按名字访问的简单方式。比如,通过下面这种方式,我们就可以调用File对象的getName与isDirectory方法:

 

  js> f.name

  test.txt

  js
> f.directory

  
false

 

  3. Rhino如何实现Java接口

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

  js> obj = { run: function () { print("\nrunning"); } }

  [
object Object]

  js
> obj.run()

  running

 

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

  js> r = new java.lang.Runnable(obj);

  adapter1@291aff

  js
> t = new java.lang.Thread(r)

  Thread[Thread
-0,5,main]

  js
> t.start()

  js
>

  running

 

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

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

  4. Rhino如何创建Java 数组

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

  js> array = java.lang.reflect.Array.newInstance(java.lang.String, 2);

  [Ljava.lang.String;@a20892

  js
> array[0] = "Double"

  Double

  js
> array[1] = "Life"

  Life

  js
> array[0] + array[1]

  DoubleLife

  js
>

 

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

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

  js> function classForName(name) {

  
try {

  
return java.lang.Class.forName(name);

  }
catch (e if e.javaException instanceof java.lang.ClassNotFoundException) {

  print(
"Class " + name + " not found");

  }
catch (e if e.javaException instanceof java.lang.NullPointerException) {

  print(
"Class name is null");

  }

  }
> > > > > > > >

  js
> classForName("NonExistingClass");

  Class NonExistingClass not found

  js
> classForName(null);

  Class name is
null

 

4
相关文章