2014-09-19 121 views
2

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

所以更换:

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

回答

4

犀牛区分一个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')"); 

并将结果放入绑定中。顺便说一句,内犀牛,如果你把Class对象为绑定在名称AwesomeObjClass,您可以使用综合性能.static获得的类型,例如:一类对象上

var AwesomeObj = AwesomeObjClass.static; 

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

希望这会有所帮助。

+0

感谢Attila的回答!我在调查过程中发现了StaticClass,它现在是内部的悲哀,也许以后会有一个更好的接口,可以在内核中使用。我会去'每班学习'选项。 – Kalidasya 2014-09-20 17:06:52

+0

完美适用于枚举thx! – 2017-05-15 20:51:05

0

在你的框架的顶层脚本做:

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

谢谢!没错,但我没有任何顶级脚本。 – Kalidasya 2014-09-19 15:22:57

+0

我的建议是有一个顶级脚本。如果你在Java和JS之间建立尽可能薄的关系,那么研究这些东西就不那么尴尬;在JS的东西上访问这些东西是非常容易的,并且(正如你发现的)在这种情况下很难在Java端执行。否则,你必须进入Nashorn的非公开API,它可以并且将会改变(我的代码在1.8.0和1.8.0u20之间,而我正在使用一个内部类)。 – 2014-09-19 16:12:45

+0

感谢您的建议,也许我以后需要一个顶级脚本,只有这些注射,我会尽量避免它。 – Kalidasya 2014-09-20 17:08:35