Lua基础知识
Lua中最基本的结构就是表(table),获取表中数据 可以用 pairs 及ipairs
两者的区别在于:
迭代table元素的(pairs),迭代数组元素的(ipairs)
元表
Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。
Setmetatable()
对象
使用元表实现对象和继承等
Java调用lua
下载 luajava-1.1.dll 和 luajava-1.1.jar 。然后,配置环境,将luajava-1.1.dll这个动态链接库 放到java目录环境下的jre的bin目录下。将 luajava-1.1.jar包放到jre/lib/ext文件下
如果碰到 no luajava-1.1 in java.library.path 这个异常,把 luajava-1.1.dll 这个文件复制去 system32文件夹下一份,重新编译。
Java调用lua例子
Java main方法
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
L.LdoFile("3.lua");
//找到函数testa
L.getField(LuaState.LUA_GLOBALSINDEX, "create");
//参数2压栈
L.pushNumber(5);;
//调用!! 一共两个参数, 1个返回值
L.call(1, 0);
//保存返回值, 到a中
L.setField(LuaState.LUA_GLOBALSINDEX, "a");
//读入a
LuaObject l = L.getLuaObject("a");
//打印结果.
L.close();
3.lua
Area = {area = 0}
function Area:new(length)
print("开始初始化")
o={} or 0
setmetatable(o,self)
self.__index = self
length =length or 0
self.area = length*length
return o
end
function Area:out()
print("你输入的正方体的面积为:",self.area)
end
function create(length)
area = Area:new(length)
area:out();
end
lua 调用java(luajava)
实现了Lua中调用Java的逻辑,但是作为一种脚本语言,Lua没办法脱离高级语言而独立运行起来,所以要测试Lua是否能正常实现对Java的调用,还是需要在Java中运行此Lua脚本。
作为一门扩展式语言,Lua没有”main”程序的概念:它只能嵌入一个宿主程序中工作,该宿主程序被称为被嵌入程序或者简称宿主。宿主程序可以调用函数执行一小段Lua代码,可以读写Lua变量,可以注册C函数让Lua代码调用。
目录结构如下:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/4341de9177aee1deaa786c5039ec72a4.png)
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/dc142d761e15e8458634be1ee8f0f3f1.png)
luajTest.lua如下所示:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/20d2838e4eb717bfdb3f99747a514802.png)
lua调用的java类JDBCUtilsConfig如下所示:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/eeb24044427364ab4ae327cee6f30e48.png)
luajava库反射调用的性能在某些情况下,竟然比java原生绑定要快。
1 在对象方法数比较少的情况下,luajava生成的类的方法执行速度比java绑定要快一点,但基本一样。
2 在对象方法数多多情况下(复杂对象),luajava生成的类的执行速度比java绑定慢(可能是绑定了不相关的方法),我的一个测试对象执行结果,luajava比java的速度大概是 1.5 : 1
3 创建对象的速度上,java绑定远优于luajava,这个基接近2:1的关系了;
选择建议:
如果是偶然使用的一个对象,建议使用luajava,方便快捷,速度也不差
如果是经常new的对象或复杂的对象(但是实际只使用部分方法)建议用java绑定
lua 调用java(luaj)
Luaj 和luajava
首先LuaJ框架是使用纯Java语言来实现的,它用Java实现了一套自己的Lua虚拟机,所以就不需要JNI来做中介了,所以对于多年不接触C/C++代码的人来看会更加舒服一些。并且该框架还在更新维护,接口用起来更加方便,但是缺点在于纯Java实现,相对C语言实现速度慢。
LuaJava框架就比上一个轻量一些,是基于Lua原生的虚拟机进行开发的,它只对标准的Lua编程API做了简单的JNI封装,Java层的代码也较少。这个框架虽然已经停止维护,但还是能支持最新的Lua5.3版本。
Luajava缺点:无法中断停止脚本、多线程问题和JavaGC超时异常等等问题
Luaj缺陷:运行速度较慢。