[英]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.