我有一个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脚本时,我得到了一个错误的参数。
它只在我使用"obj:test()“时起作用。
好像我应该在第一个参数中传递对象。
有办法做"obj.test()“工作吗?
发布于 2016-01-08 13:39:29
在没有类的实例的情况下,我找不到绑定类的静态函数并调用它的任何示例。所有示例,即使在使用静态函数时,都会传递对象的一个实例。因此,我不能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的新实例传递给它的函数来使用静态方法,从而“隐藏”一个实例的传递。
发布于 2016-01-23 06:57:29
您还可以使用等效的语法:
obj.test(obj)就像
obj:test()您应该能够获得Java类或实例的任何字段或方法,但在某些情况下需要额外的参数,而且冒号语法是一个方便的快捷方式。
为了举例说明,使用各种静态和实例字段和方法构造一个类,如下所示:
public static class MyClass {
public static String variable = "variable-value";
public String field = "field-value";
public static String func() {
return "function-result";
}
public String method() {
return "method-result";
}如果像在示例中那样强制该类的实例,下面是访问每个类的语法:
Globals globals = JsePlatform.standardGlobals();
// Load an instance into globals
LuaValue instance = CoerceJavaToLua.coerce(new MyClass());
globals.set("obj", instance);
LuaValue chunk = globals.load(
"print( obj );" +
"print( obj.variable );" +
"print( obj.field );" +
"print( obj.func );" +
"print( obj.method );" +
"print( obj:method() );" + // same as 'obj.method(obj)'
"print( obj.method(obj) );");
chunk.call(); 对我来说
Example$MyClass@4554617c
variable-value
field-value
function: JavaMethod
function: JavaMethod
method-result
method-result你也可能想强迫全班学生。除了字段之外,所有东西都可以访问,该字段不存在于类中:
// Load a class into globals, 'field' cannot be accessed
LuaValue cls = CoerceJavaToLua.coerce(MyClass.class);
globals.set("cls", cls);
chunk = globals.load(
"print( cls );" +
"print( cls.variable );" +
"print( cls.func );" +
"print( cls:func() );" + // same as 'cls.method(cls)'
"print( cls.func(cls) );" +
"print( cls.method );" +
"print( cls.method(obj) );");
chunk.call(); 产出如下:
class Example$MyClass
variable-value
function: JavaMethod
function-result
function-result
function: JavaMethod
method-result在lua中,可以通过'new‘从Java类构造一个实例,然后它的行为与其他Java实例一样:
// Construct an instance from a class using 'new'
chunk = globals.load(
"print( cls.new );" +
"print( cls.new() );" +
"print( cls.new().field );"); // etc.
chunk.call(); 输出是
function: JavaConstructor
Example$MyClass@4b67cf4d
field-value发布于 2016-01-08 13:46:55
我不太喜欢卢阿,但你说你要做的是工作
LuaValue chunk = globals.load("obj:test()");注意冒号,这就是应该如何调用该方法。
就像我说的,我不做什么,但看起来你必须这样做
https://stackoverflow.com/questions/34665003
复制相似问题