【问题标题】:How to get Luaj function parameter names inside java class?如何在 java 类中获取 Luaj 函数参数名称?
【发布时间】:2017-02-07 19:05:20
【问题描述】:

有什么方法可以获取.lua文件中定义的所有函数参数的数量和名称?

例如我的 test1.lua 是

function MyAdd( num1, num2, num3)
    local x = 0
    if(num1 <= num2) then
        x = num1 + num2 + num3 
    else
        x = (num1 - num2) + num3     
    end
    return x
end

在 Java 类中,我试图通过传递参数值来执行这个函数。

如果这个 Lua 函数是由其他用户编写并保存到一个文件夹中,而 java 应用程序加载了这个 Lua 文件而不知道里面有什么函数。如何在 java 中获取函数的名称('MyAdd')、该函数的输入参数的数量以及这些输入参数的名称(num1、num2 和 num3)

如果我知道函数的名称和输入参数的数量和顺序,我可以如下调用函数。

public static void main(String[] args) {

    int a1 = 5;
    int a2 = 10;
    int a3 = 15;

    Globals globals = JsePlatform.standardGlobals();
    globals.get("dofile").call(LuaValue.valueOf("./luascripts/test1.lua"));

        LuaValue MyAdd = globals.get("MyAdd"); 

        Varargs results = MyAdd.invoke(LuaValue.varargsOf(new LuaValue 
             [] {LuaValue.valueOf(a3), LuaValue.valueOf(a1), LuaValue.valueOf
                 (a2)}));
        System.out.println(results);
}

我希望我清楚自己要达到的目标。任何帮助表示赞赏。

【问题讨论】:

    标签: java lua luaj


    【解决方案1】:

    我认为没有直接的方法,所以这是我采取的方法。

    Sol 仅针对所提及的案例。

    1) 读取 .lua 文件的内容到一个字符串 2)检查字符串是否包含字符串“function” 3) 找到函数名的索引 4) 查找 '(' 和 ')' 的索引 5) 从步骤 4 中获取索引之间的参数作为子字符串。 6) 出现','时拆分子串并保存到字符串数组中。

        String FnctionName = null;
        String[] par_array = null;
        try {
            String contents = new String(Files.readAllBytes(Paths.get("./luascripts/test1.lua")));
            if ( contents.contains("function") ) {
    
                int space = contents.indexOf(" ");
                int left_br = contents.indexOf("(");
                int right_br = contents.indexOf(")");
                FnctionName = contents.substring(space + 1, left_br);
                String params = contents.substring(left_br + 1, right_br);
    
                par_array = params.replaceAll("\\s+", "").split(",");
    
                System.out.println(FnctionName);               
                for ( String s : par_array ) {
                    System.out.println(s);
                }
           }
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多