Передать динамически построенный объект в качестве параметра функции JS с Rhino - PullRequest
0 голосов
/ 25 марта 2020

Я надеюсь, что это простой вопрос, но я не могу найти ответ. Я использую Map как способ передачи параметров в функцию в Nashorn. Как я мог передать динамически построенный объект в качестве параметра функции в Rhino? Не могу найти это нигде. Пример был бы просто великолепен. Мне нужно передать что-то вроде этого:

{
   field1: "value1",
   field2: 2,
   someotherField: "another"
}

et c, но создается динамически во время выполнения. Мне нужно передать его скомпилированной функции js, например:

String src="function fooname(params) {\n"+
                    "   for(var key in params)\n" +
                    "   {\n" +
                    "     print(key+\" : \"+params[key])\n" +
                    "   }\n" +    
                    "}\n";
Context context = Context.enter();
Script script = context.compileString(src, "testSource", 0, null);
script.exec(context, scope);
Function foo = (Function) scope.get("fooName", scope);
foo.call(context, scope, scope, params);

Мне нужно назначить этим «params» (например, params [0]) динамически созданный js объект.

1 Ответ

0 голосов
/ 25 марта 2020

Класс Context имеет несколько отличных вариантов для этого. Вот пример, где я использовал два различных метода для выполнения sh для создания функции.

public static void main(String[] args){
        String funCode = "function(arg){ print(arg);}";
        String funName = "checkPlease";
        String objCode = "x = { one : 1, two : \"two\"};";
        Context context = Context.enter();
        Scriptable scope = context.initStandardObjects();
        context.evaluateString(scope, "function print( arg ){Packages.java.lang.System.out.println( arg );};", null, 1, null);
        context.evaluateString(scope, "print(\"to here\")", null, 1, null);

        Function fun = context.compileFunction( scope, funCode, funName, 1, null);
        Script s = context.compileString(objCode, "NA", 1, null);
        Object obj = s.exec(context, scope);
        fun.call(context, scope, fun, new Object[]{ obj});
        HashMap<String, String> map = new HashMap<>();
        map.put("this", "that");
        fun.call(context, scope, fun, new Object[]{ context.javaToJS(map, scope) });
    }

Поскольку print не входил в мою область, я просто создал функцию, используя строку оценки. Я также создал функцию, используя compileFunction. Я вызвал функцию и передал аргумент тремя разными способами. А) просто вызывая функцию javascript из javascript. Б) Компиляция строки и передача ее в качестве аргумента, C) с использованием context.javaTo JS. Это выход.

здесь
[объект объекта]
{this = that}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...