这里我在水壶修改的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中新建一个内部类?某处必须有几种方法。
非常需要任何帮助!!
答案 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之间的某些更改有关。