1

我真的坚持这一点,肯定搜索了我的谷歌,试图用 luajava 将表从 lua“导入”到 java 中的数组......现在,我已经能够做一些简单的事情,打印 lua- java中的vars并从表中读取单个元素..一切都在这里工作

JAVA

LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
L.LdoFile("data/test.lua");
L.getGlobal("x"); //I want to read lua-variable x
LuaObject obj = L.getLuaObject(L.getTop()); //So I get the top-element here
System.out.println(obj.getField("Version")); 

卢阿

    x = { ["Version"] = 1.3,["Scans"] = 3 }

现在,这对于检索单个值显然相当容易,但我想将整个对象放入 Java(作为数组或其他任何东西),所以我可以用它做一些事情。我尝试循环遍历那个 LuaObject 但因为它是还不是可迭代的或“真正的”数组,那是不可能的。简单的输出obj会告诉我它是一个 lua 表,我用 .getObject 尝试了很多愚蠢的东西,但没有成功。然后我读了一些关于代理和 .pcall 的东西(这看起来像是将 Java 中的值传递给 lua 中的函数,这不是我想要的)在(非常非常糟糕的)记录的 javadoc 中找不到任何东西,所以我希望有人有这方面的经验.. 可能真的很容易,但很难找到相关信息。对这方面的任何信息感到非常高兴!

ps 我不能更改原始 lua 文件(稍后),但该文件将只包含一个大表..

4

1 回答 1

1

Lua 是一种动态语言,表是它唯一的数据结构。一个表可以包含键/值对的任意组合,这与 Java 的静态类型相反。因此,您需要创建一个转换函数,该函数将从 Lua 表中创建一个 Java 对象。这不是 LuaJava 自动提供的。

如果你想用从 Lua 表中获取的数据填充 Java POD类,你基本上有以下选项:

  1. 手动操作(最简单) - 创建一个简单的函数,它采用 Lua 堆栈索引,在该索引处需要一个 Lua 表,然后创建您的 POD 类的 Java 实例并手动填充数据,即您需要输入所有必需的getField调用。

  2. 使用 Java 反射(更通用) - 转换函数采用 Lua 堆栈索引和 Java Class,创建该类的新实例并使用Java反射lua_next来迭代 Lua 表并填写必要的 Java 字段。

如果你只打算在一种 Lua 表上使用转换,我建议你使用第一个选项。缺点是每次更改结构时,都必须更新转换代码。第二种方法也有缺点,例如您应该如何处理丢失/额外键、子表等的情况。

于 2012-04-05T09:10:59.487 回答