You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:23:19