Java 变量参数和 rhino

Posted

技术标签:

【中文标题】Java 变量参数和 rhino【英文标题】:Java variable arguments and rhino 【发布时间】:2013-10-28 02:06:13 【问题描述】:

我正在尝试让我的所有 Java 方法都可以从 javascript 脚本中访问。

因为我想要“捷径”,所以我遵循以下指南:https://***.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

其他:

如果我尝试使用“javascript”创建“printf 的快捷方式”:

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

如果我输入任何内容,我会得到org.mozilla.javascript.Arguments@NNNNNN。如何解决?

谢谢。

更新

由于我没有找到任何解决方案,我改变了方法:现在我只使用 ScriptEngine。实际上我正在做的是暴露整个对象(不仅仅是函数)。不幸的是,每次我需要调用一个函数时,我都需要在它前面加上我公开的对象的名称。

无论如何,我可以使用可变参数创建我的 Java 方法,并且无需在 JavaScript 端进行任何修改即可使用它们。

【问题讨论】:

【参考方案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);
    

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

【讨论】:

以上是关于Java 变量参数和 rhino的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 Rhino,getEngineByName("JavaScript") 在 OpenJDK 7 中返回 null

使用 Rhino 的 Javascript 解析器,如何获取评论?

使用 require.js 和 Java/Rhino 解析模块

在java中,将局部变量作为参数传递到另一个类的方法里,在此方法里改变参数值,局部变量会改变吗

使用 Rhino(Mozilla 的 rhino)的优点

Rhino Grasshopper 参数化建模 资源合集