如何通过反射 luaj - java 通过反射,我们可以动态地获取和调用类中的方法。首先,我们需要获取类对象。在 luaj 中,我们可以使用 LuaValue 类的 get 方法获取全局变量,该变量是一个表示类的参数化类。例如,假设我们有以下 Java 类: public class MyClass { public static int myStaticMethod(int arg) { return arg * 2; } public int myInstanceMethod(int arg) { return arg * 3; } } 我们可以使用以下 luaj 代码获取 MyClass 类对象: local MyJavaClass = luajava.bindClass("com.example.MyClass") 现在我们可以通过反射调用 MyClass 类的方法。对于静态方法,我们可以使用以下代码: local result = MyJavaClass:callStatic("myStaticMethod", LuaValue.valueOf(4)) 这会将参数 4 传递给 myStaticMethod 并返回结果 8。 对于实例方法,我们需要先创建一个类的实例。我们可以使用以下代码: local myInstance = MyJavaClass:new() 现在我们可以使用以下代码调用 myInstanceMethod: local result = myInstance:call("myInstanceMethod", LuaValue.valueOf(4)) 这次调用将参数 4 传递给 myInstanceMethod 并返回结果 12。 这是使用 luaj 进行反射的简单示例。通过这种方法,我们可以在运行时动态地获取和调用 Java 类的方法。

我使用 LuaJ,它包含一个库 luajava,可以通过反射将类传递到 lua 环境中。你知道怎么做吗?我注意到有一种方法可以传递已编译的类:

_G.get("load").call(LuaValue.valueOf(
            "sys = luajava.bindClass('java.lang.System')\n" +
                    "print ( sys:currentTimeMillis() )\n")).call();

那么对于未编译的类,如何传递它呢?

点赞
用户1412471
用户1412471

如果需要通过 Reflection 调用类,可以不使用额外的第三方库,例如:

//通过反射调用类
Class cls = Class.forName("com.test.reflection.AppTest");
Object obj = cls.newInstance();

// 调用 printIt 方法
Method method = cls.getDeclaredMethod("printIt", noparams);
method.invoke(obj, null);

//调用 printItString 方法并传递字符串参数
method = cls.getDeclaredMethod("printItString", paramString);
method.invoke(obj, new String("mkyong"));

//调用 printCounter 方法
method = cls.getDeclaredMethod("printCounter", noparams);
method.invoke(obj, null);
2013-11-18 08:27:30