/ / Como estender um objeto Java no JNLua - jnlua

Como estender um objeto Java no JNLua - jnlua

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 № 1

Eu encontrei a minha resposta na pergunta abaixo SO

Adicione membros dinamicamente a uma classe usando Lua + SWIG

  1. Eu precisava perceber que estava lidando com um objeto UserData, não uma tabela - não há como adicionar membros
  2. 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