java调用 lua_Java调用Lua脚本(热载实现)

本文介绍了如何在Java项目中使用LuaJ库进行Lua脚本的调用,包括加载Lua模块、执行Lua函数、传递参数以及从Lua到Java的对象转换。通过示例展示了Java如何调用lua文件中的setName、getName、getInfoDemo等方法,并自定义工具类简化操作。
摘要由CSDN通过智能技术生成

1.在maven中导入LuaJ的依赖

org.luaj

luaj-jse

3.0.1

2.编写一个person.lua模块文件,放置在classpath路径下

-- 模块名(最好和文件名称保持一致)

local person = {}

-- 定义模块变量

person.name = nil

person.info = nil

-- 本地函数say

local function say()

print('this is a local method say')

end

-- 定义模块函数setName

person.setName = function(name)

say()

person.name = name

end

-- 定义模块函数getName

person.getName = function()

return person.name

end

-- 定义模块函数setInfo

person.setInfo = function(table)

person.info = table

end

-- 定义模块函数getInfo

person.getInfo = function()

return person.info

end

-- 定义模块函数getInfoDemo

person.getInfoDemo = function()

return {

{name='张三',age=18},

{name='李四',age=20},

{name='王五',age=22}

}

end

return person

3.编写Java代码测试

public class LuaTest {

public static void main(String[] args) throws Exception {

//lua文件路径

String path = LuaTest.class.getClassLoader().getResource("person.lua").toURI().getPath();

//LuaJ全局对象

Globals globals = JsePlatform.standardGlobals();

//获取模块对象(LuaValue表示lua的数据对象, 可以是number,string,table,function等)

LuaValue personObj = globals.loadfile(path).call();

//获取模块的name属性

LuaValue name = personObj.get(LuaValue.valueOf("name"));

System.out.println(name);

//调用模块的setName方法(设置name)

LuaValue setName = personObj.get(LuaValue.valueOf("setName"));

setName.call(LuaValue.valueOf("忠诚"));

//调用模块的getName方法(取出name)

LuaValue getName = personObj.get(LuaValue.valueOf("getName"));

LuaValue name1 = getName.call();

System.out.println(name1);

//调用模块的getInfoDemo方法(取出Lua对象的demo数据)

LuaValue getInfoDemo = personObj.get(LuaValue.valueOf("getInfoDemo"));

LuaValue demoValue = getInfoDemo.call();

LuaTable demoTable = (LuaTable)CoerceLuaToJava.coerce(demoValue, LuaTable.class);

for (int i = 1; i <= demoTable.length(); i++) {

LuaValue person = demoTable.get(i);

LuaValue name2 = person.get("name");

LuaValue age2 = person.get("age");

System.out.println(name2+":"+age2);

}

//调用模块的setInfo方法(存入Lua对象数据)

LuaValue setInfo = personObj.get(LuaValue.valueOf("setInfo"));

LuaTable luaTable1 = new LuaTable();

luaTable1.set("name","zhangsan");

luaTable1.set("age",10);

LuaTable luaTable2 = new LuaTable();

luaTable2.set("name","lisi");

luaTable2.set("age",11);

LuaTable[] luaTables = {luaTable1,luaTable2};

LuaTable luaTable = LuaTable.listOf(luaTables);

setInfo.call(luaTable);

//调用模块的getInfo方法(取出设置的Lua对象数据)

LuaValue getInfo = personObj.get(LuaValue.valueOf("getInfo"));

LuaValue infoValue = getInfo.call();

LuaTable infoTable = (LuaTable)CoerceLuaToJava.coerce(infoValue,LuaTable.class);

for (int i = 1; i <= infoTable.length(); i++) {

LuaValue person = infoTable.get(i);

LuaValue name3 = person.get("name");

LuaValue age3 = person.get("age");

System.out.println(name3+":"+age3);

}

}

}

4.自定义Lua对象JavaBean转换工具类

使用Java存取Lua对象比较繁琐,可以自定义一个工具类来实现lua对象的存取,在此不再描述,感谢观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值