2013-06-24 58 views

回答

3

看起來像它盡最大努力返回明智的對象。使用此代碼,然後改變XXX:

ScriptEngineManager mgr = new ScriptEngineManager(); 
ScriptEngine engine = mgr.getEngineByName("nashorn"); 
engine.eval("function test() { return XXX; };"); 
Object result = ((Invocable)engine).invokeFunction("test"); 
System.out.println(result.getClass().getName()); 

產量:

return 'hello world' = java.lang.String 
return 1 = java.lang.Integer 
return { name: 'Hello' } = jdk.nashorn.api.scripting.ScriptObjectMirror 
1

貌似是,即使Java對象可以在JS代碼中使用,但它仍然引用Java對象(雖然它們顯示爲函數對象,所以必須有一個包裝有),我們不能把他們當作JavaScript對象:

//"import" 
var StringTokenizer = java.util.StringTokenizer; 

print(typeof StringTokenizer); 

var st = new StringTokenizer("this is a test"); 

print(typeof st); 
java.util.StringTokenizer.prototype.name = 'myST'; 

print(st.name); 

而這裏的結果:

testObj.js:9 TypeError: Cannot set property "name" of undefined 

現在,Javascript對象將作爲「jdk.nashorn.internal.scripts.JO」實例加載。

*如果你想更方便地測試上面的代碼,只爲您的JDK的jjs(犀牛解釋)的別名,例如,如果你創建一個名爲test.js文件,你可以運行程序:

$ jjs test.js 

的Mac OS = alias jjs=’/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/jjs’

的Windows =定義一個名爲 'JAVA8_HOME' 並指向您jdk8文件夾,然後可以通過運行這個命令來調用JJS環境變量:

> 「%JAVA8_HOME%\jre\bin\jjs」 test.js