要从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脚本,最好是... 不 用 串联 和一个 评价. 目前它抛出了一个异常,并带有消息。AwesomeObj不是一个函数,这有什么意义。
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;
在这个意义上, .static
的二元函数 .class
在一个类型对象上(.static
显然在Java中并不存在,因为在Java中,类型并没有被重新定义为运行时对象)。)
var stringType = Java.type("java.lang.String");
var stringClass = stringType.class
print(stringClass instanceof java.lang.Class); // true
print(stringType === stringClass.static); // true
希望这能帮到你。
在你的框架的顶层脚本中这样做。
var AwesomeObj = Java.type("my.own.AwesomeObj");
从Java 9开始,你可以使用 jdk.dynalink.beans.StaticClass.forClass
因为它不再是内部的了。
Bindings bindings = engine.createBindings();
bindings.put("AwesomeObj", StaticClass.forClass(my.own.AwesomeObj.class));
那么你就可以在JS代码中利用.NET技术进行绑定。
var awesome = new AwesomeObj();