如何在Rhino引擎中使用javascript到新的java内部类?

时间:2015-05-07 09:01:15

标签: java javascript rhino kettle

这里我在水壶修改的Java脚本值步骤(使用 Rhino引擎)中编写一些js代码,以使用java API。实际上,所有代码都运行良好。例如:

var fileInputStream = new java.io.FileInputStream(filePath); //new file object

但是如果我想使用内部类,我怎么能在 js 环境中新建内部类?这是演示:

//java
public class Out{
   public static class In {
       public String test = "Hello";
   }
}
//use inner class
Out.In in = new Out.In();
System.out.print(in.test); // successful!!


//js
var out = new Out();    // successful
var in = new Out.In();  // error here.

错误消息

org.mozilla.javascript.Undefined@55516dbb is not a function, it is undefined

我们可以发现,javascript编译器将In()视为类Out 的函数,但实际上In()是Out的内部类。

从互联网上,我发现Nashorn是一个较新的javascript引擎,支持脚本访问java内部访问,语法就是那个

var Float = Java.type("java.awt.geom.Arc2D$Float"); // using $ to indicate inner class

我的问题是,如何从Rhino中新建一个内部类?某处必须有几种方法。

非常需要任何帮助!!

4 个答案:

答案 0 :(得分:0)

我没有使用过水壶的经验,但根据错误信息,在那里使用了Rhino JavaScript引擎。我猜,问题不在于内部类,而是缺少Packages.前缀。默认情况下,只有java.顶级包导入Rhino JavaScript上下文。可以使用Packages.前缀访问其他类。如果您的Out类位于默认包中,请尝试使用

var in = new Packages.Out.In();

如果没有,请在前面加上完整的包名。例如,如果您的Java代码出现在com.example包中,请使用

var in = new Packages.com.example.Out.In();

有关详细信息,请参阅Rhino文档。

答案 1 :(得分:0)

只需将您的/usr/local课程放入任何套餐,例如Out
然后使用org.Out JavaScript

来使用它

您正在尝试使用与Java相当的smth new org.Out.In().test;

这也不适用于Java。所以我认为这根本不是犀牛问题

你也可以试着写 Out o = new Out(); new o.In(); // compilation error here

答案 2 :(得分:0)

请尝试此代码。

var out = new Out();  
var in = new Out.In(out);

内部类构造函数需要外部类实例。

答案 3 :(得分:0)

我知道这是一个古老的问题,但是当我在Eclipse BIRT中检查一个非常相似的问题时,我偶然发现了这个问题。

我们正在使用相同的Java构造,公共外部类和公共静态内部类。 我们正在尝试通过BIRT(使用Rhino引擎)中的Javascript创建内部类的实例。

这在Java 6上失败,但在Java 8上有效,因此很明显,这与Rhino在Java 6和8之间的某些更改有关。