nashorn用绑定替换Java.type

时间:2014-09-19 11:08:07

标签: java-8 nashorn

要从JS调用Java,您可以使用Java.type。有没有办法在Bindings中绑定一个java类?

所以替换:

scriptEngine.eval("Java.type('my.own.AwesomeObj')");

有类似的东西:

Bindings bindings = new SimpleBindings();
bindings.put("AwesomeObj", my.own.AwesomeObj.class);
scriptEngine.setBindings(bingings, ScriptContext.GLOBAL_SCOPE);

我正在开发一个框架,我想为js脚本提供很多类,最好使用字符串连接 EVAL 。目前它会抛出一个异常消息:AwesomeObj不是一个函数,有什么意义。

3 个答案:

答案 0 :(得分:4)

Nashorn将类型与java.lang.Class实例区分开来,就像Java一样(在Java语言中,my.own.AwesomeObj是一种类型,而my.own.AwesomeObj.classjava.lang.Class的实例。您可以使用类型来访问静态成员,也可以使用构造函数。您不能为此目的使用Class对象。坏消息是,您无法直接获取Nashorn用于表示类型的对象;它是jdk.internal.dynalink.beans.StaticClass的一个实例,它存在于受限制的包中。但是,您可以使用

在脚本中对其进行评估。
engine.eval("Java.type('my.own.AwesomeObj')");

并将结果放在绑定中。顺便提一下,在Nashorn中,如果将Class对象放在名称AwesomeObjClass下的绑定中,则可以使用合成属性.static来获取类型,例如:

var AwesomeObj = AwesomeObjClass.static;

从这个意义上说,Class对象上的.static是类型对象.class的对偶(.static在Java中显然不存在,其中类型不是运行时对象)。

var stringType = Java.type("java.lang.String");
var stringClass = stringType.class
print(stringClass instanceof java.lang.Class); // true
print(stringType === stringClass.static); // true

希望这有帮助。

答案 1 :(得分:0)

在框架的顶级脚本中执行:

var AwesomeObj = Java.type("my.own.AwesomeObj");

答案 2 :(得分:0)

从Java 9开始,您可以使用jdk.dynalink.beans.StaticClass.forClass,因为它不再是内部的了:

Bindings bindings = engine.createBindings();
bindings.put("AwesomeObj", StaticClass.forClass(my.own.AwesomeObj.class));

然后您可以使用JS代码中的绑定:

var awesome = new AwesomeObj();