2016-03-02 1 views
3

Je sais que je peux utiliser la classe Invocable pour invoquer des méthodes sur une classe:Comment obtenir l'attribut d'un objet JS à partir de 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" 

Mais, comment puis-je obtenir l'attribut name de la personne? J'ai essayé invoker.invokeMethod(person, "name") et j'ai obtenu un NoSuchMethodError.

+0

Je pense que vous devra "exposer" tous les membres que vous voulez partager avec java part, aka créer des getters (et éventuellement des setters). – Rafouille

+0

Vous pouvez essayer d'affecter la personne à la variable en JavaScript et utiliser 'engine.get ('person.name')' – jcubic

+0

try 'person.get (" name ")' – awd

Répondre

2

Vous pouvez convertir une personne en JSObject, puis appeler le person.getMember("name"). exemple Java complet:

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

Ou, si l'objet est stocké dans le moteur portée mondiale comme dans la source javascript suivante:

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

vous pouvez alors appeler

engine.eval("rick.name");