gpt4 book ai didi

java - LuaJ - 调用 Java 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:09 26 4
gpt4 key购买 nike

我有一个 Java 类,其中包含一个名为 test 的方法:

public class MyClass() {
public String test() {
//Do Something
}
}

然后,我想在我的 Lua 脚本中调用测试方法。为了做到这一点,我做了:

Globals globals = JsePlatform.standartGlobals();

LuaValue test = CoerceJavaToLua.coerce(new MyClass());
globals.set("obj", test);
LuaValue chunk = globals.load("obj.test()");
chunk.call();

当调用 Lua 脚本时,我得到一个 bad argument 错误。

它仅在我使用“obj:test()”时有效。

好像我应该在第一个参数中传递对象。

有没有办法让“obj.test()”起作用?

最佳答案

我找不到任何绑定(bind)类的静态函数并在没有类实例的情况下调用它的示例。任何地方的所有示例,甚至在使用静态函数时,都会传递对象的实例。因此我不能 100% 确定这是不可能的(不编辑 luaj)。

库和示例中的任何静态函数实际上都是通过创建虚拟类创建的,例如参见此处 http://luaj.cvs.sourceforge.net/viewvc/luaj/luaj-vm/examples/jse/hyperbolic.java?view=markup

仔细查看 luaj 源代码会发现 luaj 不区分类中的静态函数和非静态函数,这意味着所有函数都作为非静态函数处理。有关更多信息,请参见 JavaClass.java getMethod 函数。

这是一个相当简单的例子,你可以如何完成你想要的,但遗憾的是它不需要静态方法。

package luaj;

import org.luaj.vm2.*;
import org.luaj.vm2.lib.*;
import org.luaj.vm2.lib.jse.*;

public class luaj {

static final public class MyClass {

public static int asd = 5;

static public class Test extends ZeroArgFunction {

@Override
public LuaValue call() {
System.out.println("Worked");
return NIL;
}
}
}

public static void main(String[] args) {
Globals globals = JsePlatform.standardGlobals();
LuaValue test = CoerceJavaToLua.coerce(new MyClass());
globals.set("obj", test);
LuaTable t = new LuaTable();
t.set("test", new MyClass.Test());
t.set("__index", t);
test.setmetatable(t);
LuaValue chunk = globals.load("print('Testing', obj.asd) obj.test()");
chunk.call();
}
}

通过将 obj.test 设置为包装真实 obj.test 的函数并传递一个新实例,可以使用静态方法来实现类似的方法MyClass 从而“隐藏”实例的传递。

关于java - LuaJ - 调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34665003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com