2

我试图让我所有的 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 端不做任何修改地使用它们。

4

1 回答 1

0

我遇到了同样的问题。从那时起,他们更新了有关 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});
    }
}

我希望它可以打印出一组对象。相反,我必须获取一个对象,然后在运行时使用反射来确定它是列表、数组还是单个对象,并提供适当的处理。

于 2017-02-15T20:21:26.167 回答