LuaJ - 调用 Java 方法
LuaJ - Calling a Java method
我有一个 Java Class 有一个名为 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()" 工作?
我找不到任何绑定 class 静态函数并在没有 class 实例的情况下调用它的示例。
任何地方的所有示例,甚至在使用静态函数时,都会传递对象的实例。
因此我不能 100% 确定这是不可能的(不编辑 luaj)。
库和示例中的任何静态函数实际上都是通过创建虚拟 class 创建的,例如参见此处 http://luaj.cvs.sourceforge.net/viewvc/luaj/luaj-vm/examples/jse/hyperbolic.java?view=markup
仔细查看 luaj 源代码会发现 luaj 在 class 中不区分静态函数和非静态函数,这意味着所有函数都作为非静态函数处理。有关更多信息,请参阅 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
的新实例传递给它的函数,可以使用静态方法来完成类似的方法"hiding"实例传递。
我做的不多lua,但你说你必须做的才是有效的
LuaValue chunk = globals.load("obj:test()");
注意冒号,这就是调用方法的方式。
就像我说的,我做的不多,但看起来你必须做的就是那样
您也可以使用等效语法:
obj.test(obj)
与
相同
obj:test()
您应该能够获取 Java class 或实例的任何文件或方法,但在某些情况下需要额外的参数,冒号语法是一种方便的快捷方式。
为了说明,构造一个 class 具有各种静态和实例字段和方法,例如:
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";
}
如果您像示例中那样强制使用 class 的一个实例,则访问每个实例的语法如下:
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
您可能还想强制转换 class。除了 class:
不存在的字段外,所有内容仍然可以访问
// 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 class 构造实例,然后它的行为与其他 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
我有一个 Java Class 有一个名为 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()" 工作?
我找不到任何绑定 class 静态函数并在没有 class 实例的情况下调用它的示例。 任何地方的所有示例,甚至在使用静态函数时,都会传递对象的实例。 因此我不能 100% 确定这是不可能的(不编辑 luaj)。
库和示例中的任何静态函数实际上都是通过创建虚拟 class 创建的,例如参见此处 http://luaj.cvs.sourceforge.net/viewvc/luaj/luaj-vm/examples/jse/hyperbolic.java?view=markup
仔细查看 luaj 源代码会发现 luaj 在 class 中不区分静态函数和非静态函数,这意味着所有函数都作为非静态函数处理。有关更多信息,请参阅 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
的新实例传递给它的函数,可以使用静态方法来完成类似的方法"hiding"实例传递。
我做的不多lua,但你说你必须做的才是有效的
LuaValue chunk = globals.load("obj:test()");
注意冒号,这就是调用方法的方式。
就像我说的,我做的不多,但看起来你必须做的就是那样
您也可以使用等效语法:
obj.test(obj)
与
相同obj:test()
您应该能够获取 Java class 或实例的任何文件或方法,但在某些情况下需要额外的参数,冒号语法是一种方便的快捷方式。
为了说明,构造一个 class 具有各种静态和实例字段和方法,例如:
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";
}
如果您像示例中那样强制使用 class 的一个实例,则访问每个实例的语法如下:
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
您可能还想强制转换 class。除了 class:
不存在的字段外,所有内容仍然可以访问// 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 class 构造实例,然后它的行为与其他 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