Java променливи аргументи и rhino

Опитвам се да поставя всички мои Java методи достъпни от javascript скрипт.

Тъй като искам "преки пътища", последвах следното ръководство: https://stackoverflow.com/a/19197130/2897090 . Но когато моят метод на Java има променливи аргументи, не мога да „изложа“ метода за използване с езика на javascript.

public void printf(String format, Object... args) {
    out.printf(format, args);
}
//Gives org.mozilla.javascript.EvaluatorException: Unsupported parameter type "[Ljava.lang.Object;" in method printf

Друго нещо:

Ако се опитам да направя "пряк път към printf, използвайки само "javascript":

function printf(format){
    java.lang.System.out.printf(format, arguments);
}

Ако напиша нещо, получавам org.mozilla.javascript.Arguments@NNNNNN. Как да поправя това?

Благодаря ти.

Актуализация

Тъй като не намерих никакво решение, промених подхода: сега използвам само ScriptEngine. Практически това, което правя, е да изложа целия обект (не само функции). За съжаление всеки път, когато трябва да извикам функция, трябва да поставя префикс с името на обекта, който съм изложил.

Както и да е, с това бих могъл да създам своите Java методи с променливи аргументи и да ги използвам без никакви модификации от страна на JavaScript.


person user2897090    schedule 19.10.2013    source източник


Отговори (1)


Сблъсках се със същия проблем. Оттогава те актуализираха документацията за това какво може да бъде FunctionObject. Може да вземе само малък набор от данни. Ето моето решение:

@JSFunction
public void log(Object messages) {
    if(messages instanceof  List) {
        console.log(((List)messages).toArray());
    }
    else if (messages instanceof Object[]) {
        console.log(((Object[])messages));
    }
    else {
        console.log(new Object[]{messages});
    }
}

Исках да вземе масив от обекти за отпечатване. Вместо това трябваше да взема обект, след което да използвам отражение, за да разбера дали е списък, масив или единичен обект по време на изпълнение и да осигуря подходяща обработка.

person Gabe Sechan    schedule 15.02.2017