java - LuaJava:使用 LuaJava 将整个 Lua-Table 导入类 Java 数组

标签 java arrays lua lua-table luajava

我真的被困在这个问题上,绝对搜索了我的谷歌,试图用luajava将一个表从lua“导入”到java中的数组...... 现在,我已经能够做一些简单的事情,在 java 中打印 lua-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")); 

LUA

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

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

附:我无法更改原始 lua 文件(稍后),但该文件将只包含一个大表..

最佳答案

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

如果要填写Java POD类与从 Lua 表中获取的数据,您基本上有以下选项:

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

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

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

关于java - LuaJava:使用 LuaJava 将整个 Lua-Table 导入类 Java 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021569/

相关文章:

java - 有没有一种方法可以使用 for 循环对具有与其关联的字符串的整数求和?

function - 从lua中的函数args获取子表的索引

python - 在 Numpy 数组中匹配模板的最有效方法是什么?

java - 返回 int[][] 数组

Lua表: performance hit for starting array indexing at 0?

string - Lua中^和gsub的使用

java - Java中数值对象之间的转换

java - LinkedList深拷贝java

java - 有没有更好的方法可以在不编写自己的位置请求服务的情况下准确使用地理围栏?

java - 如何将 JSP 变量转换为 Struts2 变量?