我想将一个Java类的实例作为userdata返回到我的lua脚本。是否可以从lua访问此实例的属性和函数?
喜欢这样
local car = Car.getNew()
print(car.hasHonked)
car:honk()
print(car.hasHonked)
这是我解决问题的尝试
Java(缩写)
public class CarModule extends TwoArgFunction {
String moduleName = "Car";
public LuaValue call(LuaValue modname, LuaValue env) {
LuaValue library = new LuaTable();
library.set("getNew", new getNew());
env.set(moduleName, library);
return library;
}
static class getNew extends ZeroArgFunction {
@Override
public LuaValue call() {
return LuaValue.userdataOf(new Car());
}
}
}
public class Car {
private int count;
@Override
public String toString() {
return "Hello World";
}
public void honk() {
count++;
}
public int getHonks() {
return count;
}
}
LUA
local car = Car.getNew()
print(car) -- foo.bar.lua.module.CarModule$Car@1ef7fe8e
print(type(car)) -- = userdata
print(car.honk) -- = nil
print(car.getHonks) -- = nil
print(car:honk) -- = LuaError: function arguments expected
print(car:getHonks) -- = LuaError: function arguments expected
print(tostring(car)) -- = Hello World
car:honk() -- = LuaError: attempt to call nil
car:getHonks() -- = LuaError: attempt to call nil
编辑:
找到答案here
而不是
return LuaValue.userdataOf(new Car());
我必须使用
return CoerceJavaToLua.coerce(new Car());
答案 0 :(得分:1)
您可以尝试将对car.hasHonked
的访问权限链接到从java返回值的函数。
我没有使用过luaj所以我无法评论它是如何完成它的,但这里是与lua完成相同的原则。您需要做的就是将__index函数替换为访问变量的函数。
该代码使用元表来允许将未找到的键链接到函数。
Car = {}
function Car.__index(table, key)
print(Car, table, key)
return "the java value according to key"
end
function Car.getNew()
return setmetatable({}, Car) -- sets metatable for userdata or table
end
local car = Car.getNew()
print(car.hasHonked)
-- prints:
-- table: 0xa64f80 table: 0xa6e370 hasHonked
-- the java value according to key
另一种选择可能就是直接使用如下所示的函数。这些函数将调用java并返回真正的java值。
car = {}
function car.getHonked()
return "the java value"
end