基于LuaJ实现Java Player类与Lua自定义方法的绑定及双向调用
实现Java Player实例调用Lua自定义方法(支持双向调用)
1. 引入LuaJ依赖
用LuaJ作为Java与Lua的桥接库,Maven项目直接添加以下依赖:
<dependency> <groupId>org.luaj</groupId> <artifactId>luaj-jse</artifactId> <version>3.0.1</version> </dependency>
2. 扩展Java Player类(适配双向调用)
为了让Lua能调用Java侧的属性/方法,给Player类新增getName方法:
class Player { private String name; public Player(String name) { this.name = name; } @Override public String toString() { return "Player{name='" + name + "'}"; } // 新增getter,供Lua调用 public String getName() { return name; } }
3. 核心整合代码
将Java Player类注册到Lua环境,绑定Lua自定义方法到Player元表,实现所有实例可调用:
import org.luaj.vm2.*; import org.luaj.vm2.lib.jse.JsePlatform; public class LuaJavaIntegration { public static void main(String[] args) { // 初始化Lua全局环境 Globals globals = JsePlatform.standardGlobals(); // 把Java的Player类注册到Lua环境,命名为"Player" LuaValue playerClass = CoerceJavaToLua.coerce(Player.class); globals.set("Player", playerClass); // 加载Lua库脚本(也可以从文件读取,这里直接用字符串示例) String luaScript = "function Player:addPartner(partnerName)\n" + " print('Party partner added from Lua script! Current player: ' .. self:getName())\n" + " if partnerName then\n" + " print('Partner name: ' .. partnerName)\n" + " -- Lua调用Java构造方法创建新Player实例\n" + " local partner = Player.new(partnerName)\n" + " print('Created partner: ' .. partner:toString())\n" + " end\n" + "end"; LuaValue chunk = globals.load(luaScript); chunk.call(); // 获取Player元表,将addPartner方法挂到__index上 // 这样所有Player实例(Lua中为userdata)都能继承该方法 LuaValue playerMetatable = playerClass.getmetatable(); playerMetatable.set(LuaValue.INDEX, playerMetatable); playerMetatable.set("addPartner", globals.get("addPartner")); // -------------------------- // 测试Java调用Lua方法 // -------------------------- Player alice = new Player("Alice"); // 将Java Player实例转为Lua可识别的对象 LuaValue luaAlice = CoerceJavaToLua.coerce(alice); // 无参调用Lua方法 luaAlice.invoke("addPartner"); // 带参调用Lua方法 luaAlice.invoke("addPartner", LuaValue.valueOf("Bob")); } }
4. 关键逻辑说明
- self的绑定:Lua的
Player:addPartner()语法等价于Player.addPartner(self),当方法挂到Player元表后,Lua会自动把Java侧的Player实例作为self传入,因此在Lua中可通过self直接调用Java的public方法(比如self:getName())。 - 双向调用:LuaJ自动处理Java与Lua的类型转换,Java对象在Lua中以userdata形式存在,可直接调用其public方法;Lua函数则可通过
invoke方法被Java调用,支持传参。
5. 运行输出结果
执行上述代码后,控制台会输出:
Party partner added from Lua script! Current player: Alice Party partner added from Lua script! Current player: Alice Partner name: Bob Created partner: Player{name='Bob'}
内容的提问来源于stack exchange,提问作者Alfred Souza
相关产品推荐
相关产品推荐

