从Luaj继承Java类
2014-10-25 15:15:27
收藏:0
阅读:70
评论:2
在 Luaj 中,是否可以让 Lua 类继承 Java 类?我尝试在绑定的类上使用 getmetatable(),但似乎它返回了 nil。
这里,Wizard 是一个绑定到 Lua 的 Java 类,而 SetupWizard 是我想从 Wizard 继承的 Lua 类。
function SetupWizard:new()
local self = setmetatable({}, getmetatable(Wizard))
return self
end
将 __index 赋值为 Wizard 的值也不起作用。
SetupWizard 定义:
SetupWizard = {
host = nil,
user = nil,
password = nil,
database = nil,
mySqlTables = {
users = nil,
},
}
SetupWizard.__index = Wizard
... 在此处编写 SetupWizard 方法
点赞
用户3175859
你的基于 Java 的 LuaJ 模块需要返回一个表格,并且你使用了以下代码:
local SetupWizard = require("SetupWizard")
local Wizard = {}
setmetatable(Wizard, {__index=SetupWizard})
--optionally create single metatable for all Wizard instances: local wizardMetaTable = {_index=Wizard}
function Wizard:new()
local T = {}
setmetatable(T, {__index=Wizard})
-- setmetatable(T, wizardMetaTable)
-- this increases performance by using one metatable for all wizards.
return T
end
2015-03-08 23:26:32
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
LuaJ 相对灵活,比如在引入 Java 类方面有多种方式。
你并没有说明你是如何引入 Java 类的,因此我假设你通过创建一个Java 函数库 作为桥梁来构建模块。你可以通过
require"moduleName"引入它,如下所示:import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.OneArgFunction; import org.luaj.vm2.lib.TwoArgFunction; /* * 当 require"module name" 被调用时,在 LuaJ 中它也会搜索 Java 类,如果类名与给定的模块名称匹配, * 且继承了 LuaFunction 并且有默认构造函数,那么它将调用 call(LuaValue moduleName, LuaValue globalEnviroment) 方法, * 并将模块名称字符串和全局环境作为 LuaValues 传递给它,将此调用的返回值作为自己的返回值。 * */ public class Example extends TwoArgFunction{ @Override public LuaValue call(LuaValue modname, LuaValue globalEnv) { // 创建一个表来放置所有我们的函数 LuaValue table = LuaValue.tableOf(); // 在表中设置值“name”为 example。这在 example 方法中使用 table.set("name", "example"); // 在表中设置值“exampleMethod”,为我们下面创建的类型为 OneArgFunction 的类 table.set("exampleMethod", exampleMethod); // 最后返回我们的表。这个值然后将被 require 返回。 return table; } /* 创建一个有一个参数 self 的函数。 这模拟了在 Lua 中创建一个方法,并且可以被调用,当被添加到表中时,可以像这样被调用:table:exampleMethod()。 这是因为在 Lua 中,冒号语法糖用于 object.function(object)。 */ OneArgFunction exampleMethod = new OneArgFunction() { @Override public LuaValue call(LuaValue self) { if(self.istable()) { return self.get("name"); } return NIL; } }; }然后,你可以在 Lua 代码中这样使用它:
-- 引入我们创建的 Wrapper 类 example = require"Example" -- 打印调用 exampleMethod 的返回值 print("The name of the class is: "..example:exampleMethod()) -- 然后像这样使用索引 example2 = setmetatable({},{__index=example}) example2.name = "example2" print("The name of the class is: "..example2:exampleMethod())如我在答案开头所述,LuaJ 相对灵活,具体怎样实现可以有多种方式。由于我的声望不够,我无法发表评论询问您如何在 LuaJ 中引入 Java 类,欢迎在此答案下评论进行澄清。