nashorn用绑定代替Java.type

问题描述 投票:3回答:3

要从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不是一个函数,这有什么意义。

java-8 nashorn
3个回答
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;

在这个意义上, .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

希望这能帮到你。


0
投票

在你的框架的顶层脚本中这样做。

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

0
投票

从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();
© www.soinside.com 2019 - 2024. All rights reserved.