要从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不是一个函数,有什么意义。
答案 0 :(得分:4)
Nashorn将类型与java.lang.Class
实例区分开来,就像Java一样(在Java语言中,my.own.AwesomeObj
是一种类型,而my.own.AwesomeObj.class
是java.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();