2016-03-02 9 views
3

Я знаю, что могу использовать Invocable класс для вызова методов на классе:Как получить атрибут JS-объекта из Java?

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-частью, иначе создайте геттеры (и, возможно, сеттеры). – Rafouille

+0

Вы можете попытаться назначить человека переменной в JavaScript и использовать 'engine.get ('person.name')' – jcubic

+0

try '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")); 

Или, если объект находится в глобальной области видимости двигателя, как в следующем яваскрипте источника:

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

вы можете позвонить

engine.eval("rick.name"); 

 Смежные вопросы

  • Нет связанных вопросов^_^