2016-03-02 21 views
3

我知道我可以使用Invocable類調​​用一個類的方法:如何從Java獲取JS對象的屬性?

import javax.script.{ScriptEngine, ScriptEngineManager, Invocable} 

val engine = new ScriptEngineManager().getEngineByExtension("js") 

val invoker = engine.asInstanceOf[Invocable] 

val person = engine.eval(s""" 
    new function() { 
    this.name = "Rick"; 
    this.age = 28; 
    this.speak = function() { 
     return this.name + "-" + this.age; 
    } 
    }; 
""") 

invoker.invokeMethod(person, "speak") //returns "Rick-28" 

但是,我如何才能的人的name屬性?我試過invoker.invokeMethod(person, "name"),我得到NoSuchMethodError

+0

我想你將不得不「暴露」你想與java部分共享的所有成員,也就是創建getter(和可選的setter)。 – Rafouille

+0

您可以嘗試在JavaScript中將人員分配給變量並使用'engine.get('person.name')' – jcubic

+0

嘗試'person.get(「name」)' – awd

回答

2

您可以將人員轉到JSObject,然後致電person.getMember("name")。完整的Java例子:

ScriptEngine engine = new ScriptEngineManager() 
          .getEngineByExtension("js"); 

JSObject rick = (JSObject) engine.eval("new function() {\n" + 
     "   this.name = \"Rick\";\n" + 
     "   this.age = 28;\n" + 
     "   this.speak = function() {\n" + 
     "    return this.name + \"-\" + this.age;\n" + 
     "   }\n" + 
     "  };"); 

System.out.println(rick.getMember("name")); 

或者,如果對象存儲在發動機全球範圍內如以下JavaScript源:

rick = function() { 
    this.name= "Rick"; 
}; 

,你可以調用

engine.eval("rick.name");