7
votes

Java Scripgine: Utiliser la valeur sur le côté Java?

Dans un programme Java J'invoque un programme JavaScript défini par l'utilisateur:

File userJSFile=...;
javax.script.ScriptEngineManager mgr=new  ScriptEngineManager();
javax.script.ScriptEngine scripEngine= mgr.getEngineByExtension("js");
Object result=scripEngine.eval(new java.io.FileReader(userJSFile));


0 commentaires

3 Réponses :


0
votes

Ce lien peut être utile. Il semble que le mieux que vous puissiez faire est de compter sur une classe spécifique à la mise en œuvre.


0 commentaires

9
votes

Sauf peut-être pour des valeurs simples, je préférerais laisser le moteur de script coerce ses valeurs aux types Java. xxx

même si vous ne pouvez pas modifier le script, vous pouvez prendre la valeur de retour et transmettez-le à travers votre propre script généré pour faire la contrainte. Cela suppose que vous savez que vous savez quelque chose à propos de la valeur renvoyée.


Edit: puisque rien n'est connu sur la valeur de retour, je le testerais d'abord à l'aide de Java ( GetClass () ) Pour voir si c'était l'un des Java.lang les types. Si l'objet renvoyé provient de l'API privé à la bibliothèque, je l'intrigeais à l'aide de la langue de script (dans ce cas JavaScript), ce qui la contraint de le contraindre à un type Java ou de repousser ses propriétés dans une structure de données Java pendant le processus.

Mon Javascript est rouillé, mais le tutoriel de John Lesach's a l'air assez bien: Introspection JavaScript .

(Vous pourrez peut-être utiliser la réflexion Java, mais comme la mise en œuvre du moteur peut varier entre les versions Java / JRES / JavaScript, je ne voudrais pas compter sur elle.)


0 commentaires

2
votes

Cette question a été posée il y a longtemps, mais les réponses semblaient toujours correctes. Au cas où il est intéressant de toujours essayer de passer des objets complexes entre Java et JavaScript, je voulais présenter ma solution.

J'ai écrit un script qui convertit les objets JSON NativeObject à (en mémoire) (en réalité, j'utilise le BSON de MongoDB Objets -Based, mais vous devriez simplement être capable de remplacer 1-1 pour JSONARRAY et JSONOBJECT dans le code d'échantillon ci-dessous).

Donc, par exemple, dites que j'ai un script (utilisateur) "CREATE_OBJECT_Script", qui "Renvoie" un objet ou un éventail d'intérêts, puis je peux le convertir en Json (c'est-à-dire une liste de hashmaps) comme suit: xxx

évidemment si vous avez le contrôle sur le " Create_Object_script "Script Vous pouvez le faire en une seule étape; Mes scripts sont générés par l'utilisateur, de sorte que cachant cette complexité est nécessaire - les utilisateurs n'écrimentent que des scripts où la "valeur de retour" est la dernière ligne.

J'ai gisté le "Parsing_script" ici pour garder la longueur de ce post vers le bas.

fonctionnellement cela fonctionne très bien; Je n'ai pas beaucoup développé à JS, il est donc possible qu'il existe des moyens plus efficaces de faire cela. (Remarque J'ai toujours besoin de mes résultats dans une liste, si vous ne pouviez pas alors passer dans un "wastobj" basicdbobject et écrivez à cela au lieu de l'affaire Singleton).

J'espère que cela aide quelqu'un qui aime eux-mêmes dans ma situation à 1 heure la nuit dernière!


0 commentaires