使用LuaJava从Lua文件调用具有可变数量参数的Java方法

在我们的项目中,我尝试从 Lua 调用一个带有可变参数的 Java 方法。因此,Java 方法的代码如下:

public static void addEvent( String luaFile, String function,
                             int milliseconds, Object...args )
{
    events.add( new TimerEvent( luaFile, function, milliseconds, args ) );
}

我想在 Lua 文件中使用以下语句调用此方法:

mgr:addEvent( "luaFile.lua", "doSomething", 3000, var )

但是使用 Luajava 时,我总是会遇到错误:

PANIC: unprotected error in call to Lua API (Invalid method call. No such method.)

即使删除“var”参数或添加更多参数也不起作用。

因此,也许你们中的任何人都曾在 Lua 文件中使用具有可变参数的 Java 方法,并可以给我一些提示,我该如何解决这个问题。我不想在 Lua 文件中使用太多代码行来创建 ArrayList 并添加参数并将此 ArrayList 传递给 Java 方法。因此,也许还有一种简单的方法可以创建一个数组,我可以将其作为数组传递给 Java。因此,解决方案不一定要使用 vargs,但我认为这是一种简单的方法。

提前感谢任何帮助

原文链接 https://stackoverflow.com/questions/9593062

点赞
stackoverflow用户256196
stackoverflow用户256196

一个可变参数(例如Object... args)实际上是Object[]类型。

Lua(可能)不能识别可变参数并动态创建数组,可以尝试使用以下代码:

mgr:addEvent( "luaFile.lua", "doSomething", 3000, {var})
2012-03-06 22:44:44
stackoverflow用户221509
stackoverflow用户221509

很遗憾,LuaJava 目前不支持 Java 数组。它不允许构造新的 Java 数组,也不支持数组操作(包括获取和设置值)。因此它无法支持 Object... args 语法。

您可以通过使用专门的方法来解决这个问题。这些方法分别支持 0、1、2、3 个参数(我认为您不需要超过 3 个)。然后您可以添加一个 Lua 可变参数函数来调用适当的函数。下面是一个 3 个参数调用的示例:

public static void addEvent3( String luaFile, String function,
                             int milliseconds, Object arg1, Object arg2, Object arg3 )
{
    events.add(new TimerEvent(luaFile, function, milliseconds, new Object[] {arg1, arg2, arg3}));
}
2012-03-08 19:43:44
stackoverflow用户16418916
stackoverflow用户16418916
public static Object[] ConvertTableToArray(LuaTable table, Class toClass) {
    var array = Array.newInstance(toClass, table.length());
    for (int i = 0; i < table.length(); i++) {
        var v = table.get(i + 1).touserdata(toClass);
        Array.set(array, i, v);
    }
    return (Object[]) array;
}

在 Lua 中调用此函数,请确保 LuaTable 中仅包含 toClass 类型的对象。

示例:

JavaClass:ConvertTableToArray({obj1,obj2,obj3},obj1:getClass())
2021-07-10 07:18:51