2014-06-10 3 views
2

Existe-t-il un moyen d'obtenir et d'utiliser une classe Java étendue à partir de JavaScript (Nashorn)? Ce que j'essaie de faire est d'étendre une classe Java dans Nashorn, puis de le renvoyer à Java. Par exemple, nous définissons une classe qui étend une autre classe JS:Obtenir la classe Java étendue de Nashorn

var SomeClass= Java.type("com.test.SomeClass"); 
var MySomeClass = Java.extend(SomeClass, { 
    aMethod1: function() { 
     print("m1"); 
    }, 
    aMethod2: function() { 
     print("m2"); 
    }, 
}); 

J'ai essayé d'obtenir cet objet étendu en Java comme ceci: Object mySomeClass = scriptEngine.get("MySomeClass");

Cependant, je suis incapable de faire une méthode appelle cet objet en Java. Il lance toujours une exception lorsque j'essaie de le lancer dans une classe de base - com.test.SomeClass.

Est-il possible d'utiliser une classe étendue créée dans Nashorn (JS) en Java?

Répondre

3

Voici un exemple de travail s'étendant ArrayList:

String script = "(function() {\n" + 
    " var ArrayList = Java.type('java.util.ArrayList')\n" + 
    " var ArrayListExtender = Java.extend(ArrayList)\n" + 
    " var list = new ArrayListExtender() {\n" + 
    " get: function(idx) {\n" + 
    "  return idx >= list.size() ? " + 
    "'no such value' : Java.super(list).get(idx);\n" + 
    " }\n" + 
    " }\n" + 
    " return list;\n" + 
    "}());"; 

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 
    @SuppressWarnings("unchecked") 
    List<String> result = (List<String>) engine.eval(script); 
    result.add("gotcha"); 
    System.out.println(result.get(0)); 
    System.out.println(result.get(10)); 

Vous ne précisez pas quelle exception vous obtenez, mais le problème est probablement dans la façon dont vous consommez ou utilisez le type. Notez que ni Java.type ni Java.extend renvoient un java.lang.Class - ces méthodes retournent un type Nashorn interne avec une API non documentée.

+0

Merci McDowell, ça marche maintenant. Mon erreur était assez simple, j'ai oublié de créer réellement un objet pendant/après l'utilisation de Java.Extend (...). :) –

Questions connexes