繁体   English   中英

如何在 Rhino 引擎中使用 javascript 来创建新的 Java 内部类?

[英]How to use javascript to new java inner class in Rhino engine?

这里我在kettle Modified Java Script Value step(使用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 的内部类。

从网上找了下较新的javascript引擎Nashorn支持脚本访问java内部访问,语法是

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

我的问题是,我怎样才能从 Rhino 新建一个内部类??? 某处一定有几种方法。

非常需要任何帮助!!

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

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

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

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

有关更多信息,请参阅Rhino文档。

只需将您的Out类放入任何包中,例如org.Out
然后在JavaScript使用它,就像这个new org.Out.In().test;

你正在尝试做 smth 相当于 Java Out o = new Out(); new o.In(); // compilation error here Out o = new Out(); new o.In(); // compilation error here

这在 Java 中也不起作用。 所以我认为这根本不是 Rhino 的问题

你也可以尝试写var field = new org.pentaho.di.trans.steps.mongodboutput.MongoDbOutputMeta.MongoField();

请试试这个代码。

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

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

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

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

这在 Java 6 中失败,但它适用于 Java 8,所以显然这与 Java 6 和 8 之间 Rhino 的一些变化有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM