Eu estou experimentando usar o JNLua "s módulo javavm para se conectar e estender uma biblioteca Java (JAR). Até agora eu estou super impressionado com o quão fácil é passar objetos Java para frente e para trás entre Lua e Java - ausência de aparência.
Agora estou interessado em estender esses objetos Javaem LUA. Na minha abordagem ingênua, eu envolvi o objeto Java em uma classe Lua com a intenção de estender a API de objetos, ou seja, adicionar métodos a ele. Mas não quero ter que recriar, dentro do wrapper, todos os métodos de objetos Java . Parece que eu deveria ser capaz de herdar do objeto Java para que, quando um método estiver ausente do meu wrapper, o Lua procure por ele no objeto Java, que é um membro da classe wrapped. Eu tentei adaptar os exemplos mostrados em Herança mas isso é um pouco complicado de configurar, já que estou lidando com um objeto Java. Pensamentos?
Respostas:
0 para resposta № 1Eu encontrei a minha resposta na pergunta abaixo SO
Adicione membros dinamicamente a uma classe usando Lua + SWIG
- Eu precisava perceber que estava lidando com um objeto UserData, não uma tabela - não há como adicionar membros
- Eu precisava de um kung-fu metatável
O código abaixo tem o efeito de permitir estender (adicionar métodos) um objeto Java.
function Model:new (model)
o = {}
WrapObject(Model, o, model)
self.__index = self
self.model = model or nil
return o
end
function WrapObject(class, object, userData)
local wrapper_metatable = {}
function wrapper_metatable.__index(self, key)
local ret = rawget(class, key)
if(not ret) then
ret = userData[key]
if(type(ret) == "function") then
return function(self, ...)
return ret(userData, ...)
end
else
return ret
end
else
return ret
end
end
setmetatable(object, wrapper_metatable)
return object
end
function Model:Test ()
name = self:GetFullName()
fileName = self:GetFileName()
ret = name .. fileName
print("It"s a test!!")
return ret
end