2014-09-19 123 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