Java LuaJ overwrite.new()

Java LuaJ overwrite.new(),java,metatable,luaj,Java,Metatable,Luaj,我试图用LuaJ覆盖.new()lua函数(方法?)。 我试图在metatable中为我的表设置一个“new”键,但在lua中调用.new()时,它被忽略,并运行默认的java支持的函数,将表创建为java对象 如果我将键重命名为(例如)“new2”,并使用“table.new2()”创建它,那么它就可以正常工作 希望有人能帮我 迄今为止的代码: LuaValue vectorClass = CoerceJavaToLua.coerce(Vector3Lua.class); lu

我试图用LuaJ覆盖.new()lua函数(方法?)。 我试图在metatable中为我的表设置一个“new”键,但在lua中调用.new()时,它被忽略,并运行默认的java支持的函数,将表创建为java对象

如果我将键重命名为(例如)“new2”,并使用“table.new2()”创建它,那么它就可以正常工作

希望有人能帮我

迄今为止的代码:

    LuaValue vectorClass = CoerceJavaToLua.coerce(Vector3Lua.class);
    luaj.globals.set("Vector3", vectorClass);

    LuaTable table = new LuaTable();
    table.set("new2", new ThreeArgFunction() {
        public LuaValue call(LuaValue x, LuaValue y, LuaValue z) {
            System.out.println("Created new Vector: " + x + ", " + y + ", " + z);
            return LuaValue.NIL;
        }
    });
    table.set("__index", table);

    vectorClass.setmetatable( table );
Lua测试仪:

    local test1 = Vector3.new(2, 3, 4);  --> Does not print test message
    local test2 = Vector3.new2(4, 4, 4); --> Does print test message

这样做的原因是,我可以对自动创建的“Vector3”的每个实例应用元表,从而对用户隐藏内部功能。

不幸的是,我对LuaJ了解不够,无法给您一个好的答案,但是我可以告诉您,您当前的解决方案将不起作用,因为当访问一个已经不存在的密钥时,实际上会调用
\u index
。在您的情况下,由于已存在
vectorClass.new
,因此在执行代码
Vector3.new
时不会调用
\uu索引。除此之外,您是否不能说类似于
vectorClass.set(“new”,--[[function here]])
?解决方案不是使用强制Ejavatola()。为了获得所需的功能,我必须创建一个扩展LuaValue的Vector类。从那里我可以设置元表,然后创建一个.new()方法。不幸的是,我对LuaJ了解不够,无法给您一个好的答案,但我可以告诉您,您当前的解决方案将不起作用,因为当访问一个已经不存在的键时,实际上会调用
\u index
。在您的情况下,由于已存在
vectorClass.new
,因此在执行代码
Vector3.new
时不会调用
\uu索引。除此之外,您是否不能说类似于
vectorClass.set(“new”,--[[function here]])
?解决方案不是使用强制Ejavatola()。为了获得所需的功能,我必须创建一个扩展LuaValue的Vector类。从那里我可以设置元表,然后创建一个.new()方法。