【问题标题】:How to extend a Java object in JNLua如何在 JNLua 中扩展 Java 对象
【发布时间】:2016-08-01 20:41:05
【问题描述】:

我正在尝试使用 JNLua 的 javavm module 来连接和扩展 Java 库 (JAR)。到目前为止,我对在 Lua 和 Java 之间来回传递 Java 对象的简单性印象深刻。

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

【问题讨论】:

    标签: jnlua


    【解决方案1】:

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

    Add members dynamically to a class using Lua + SWIG

    1. 我需要意识到我正在处理一个 UserData 对象,而不是一个表 - 无法添加成员
    2. 我需要一些可转换的功夫

    下面的代码可以让我扩展(添加方法)一个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多