如何在JNLua中扩展Java对象

时间:2016-04-11 15:24:12

标签: jnlua

我正在尝试使用JNLua的javavm module来连接和扩展Java库(JAR)。到目前为止,我对在Lua和Java-seemless之间来回传递Java对象是多么容易感到非常满意。

现在我有兴趣在LUA中扩展这些Java对象。在我天真的方法中,我将Java对象包装在Lua类中,目的是扩展该对象API,即向其添加方法。但我不想在包装器中重新创建所有Java对象方法。看起来我应该能够继承Java对象,这样当我的包装器中缺少一个方法时,Lua将在Java对象中查找它,它是包装类的成员。我已经尝试调整Inheritance中显示的示例,但这是一个稍微棘手的设置,因为我正在处理Java对象。想法?

1 个答案:

答案 0 :(得分:0)

我在下面的SO问题中找到了答案

Add members dynamically to a class using Lua + SWIG

  1. 我需要意识到我正在处理一个UserData对象,而不是一个表 - 无法添加成员
  2. 我需要一些可以表达的功夫
  3. 下面的代码可以让我扩展(添加方法)一个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