LuaJava学习笔记[2]使用Lua控制Java对象

LuaJava学习笔记

使用Lua控制Java对象

[资源准备]

本次依然使用LuaJava1.1作为工具,你可以到这里进行下载:http://luaforge.net/projects/luajava/。不要忘记将本地库放到项目目录中去。我的工作目录是这样的:

为了方便,我使用Maven进行的项目依赖关联,你也可以将luajava的jar包导入项目中,这两者都是等效的。如果使用的linux进行开发,你的本地库名称应该是一个so文件,这些库文件在链接页面中都可以找到。

[源文件]

TestObject.java

package com.thrblock.lua.luatest;

public class TestObject {
	/**普通方法的测试
	 * */
	public void sayStr(String str){
		System.out.println(str);
	}
	/**静态方法的测试
	 * */
	public static void stTest(){
		System.out.println("static method");
	}
	/**带有返回值方法的测试
	 * */
	public String getInfo(){
		return "Test Info";
	}
	/**一个延时函数
	 * */
	public void delay(int millSecond){
		try {
			Thread.sleep(millSecond);
		} catch (InterruptedException e) {}
	}
}

Main.java

package com.thrblock.lua.luatest;

import org.keplerproject.luajava.LuaState;
import org.keplerproject.luajava.LuaStateFactory;

public class Main {
	public static void main(String[] args) {
		LuaState l = LuaStateFactory.newLuaState();
		l.LdoFile("./scripts/main.lua");//设置脚本

		TestObject m = new TestObject();//实例化测试对象

		l.getGlobal("doScript");//设置方法入口
		l.pushJavaObject(m);//设置参数
		l.call(1, 0);//调用方法(阻塞)

		System.out.println("call complete!");
	}
}

main.lua

function doScript (obj)
	obj:sayStr("delay 2 sleep...")
	obj:delay(2000)
	obj:sayStr("done! and another sleep 2...")
	obj:delay(2000)
	obj:sayStr("done!")
	obj:stTest()
end

[测试结果]

delay 2 sleep...

done! and another sleep 2...

done!

static method

call complete!

[意义何在]

在传统的编程中,我们开发各个模块,最后使用恰当的运行脉络(例如主线程)调用模块中的各个方法,调用过程的控制依赖于硬编码,通用性不是很高而且维护成本较大。

为了改变硬编码的不足,诸多解决方案与框架开始出现,一个典型的模式是使用接口进行模块间的耦合隔离,并配合配置文件+反射的机制来控制接口对应的实现加载,这样我们仅需改变配置文件即可对程序的整体运行进行控制。例如JSP的Servlet、Struts中的Action、Android中的Activity、Spring的依赖注入以及各种JPA实现中配置的实体bean等等,对编码敏感的人应该注意到上述类没有一个是我们new出来的,它们由容器通过xml配置文件进行恰当的加载与实例化。

即使有如上诸多手段降低程序改变的成本,但需求依然没被满足。有些程序对模块的实现并不敏感,但对模块的调用序列敏感,此时上面方案能起到的作用变得极其有限,这常见于各类游戏。

举例说明,比如一个飞行射击游戏,包含一个产生敌人的模块:

Model.generateEnemy(TYPEtype,Action anction,int x,int y);

其中type泛指敌人的类型,action代指敌人的运动模式,xy是产生在屏幕的坐标点。那么,整个游戏的游戏性极大地依赖于该模块的调用序列,即何时、何地、产生何种类型的敌人以及使用何种移动策略。

调用序列的不同一般会反映到各种关卡、MOD、甚至游戏DLC上,因此有效地组织调用序列变得意义极大。但一般的配置文件显然不擅长叙述调用序列的结构,因为不同序列间差异极大并且可能包含有逻辑控制结构(例如根据玩家选择的难度、角色不同而创建不同的敌人),所以脚本成为了解决此类问题的主力——不需要编译、成本低廉、能够叙述大部分控制结构。而Lua,除了这些特性外,其多平台支持和与其它语言的超高亲和能力使它备受游戏开发者的青睐。设想一下,我们为游戏开发DLC时,仅仅更新几个小巧的lua脚本,这真是件惬意的事情。

[总结]

本次介绍了一个使用Lua控制Java类的方法,对于传入的Java类对象,使用Lua脚本控制其调用序列。

在文章的最后部分,我们讨论了软件开发中为了降低维护成本所出现的典型方案,以及脚本在其中所扮演的角色。

最后,我们对脚本所擅长解决的问题加以概括,那就是对模块调用序列敏感的程序可以将调用过程交由脚本控制。

时间: 2024-11-29 03:31:02

LuaJava学习笔记[2]使用Lua控制Java对象的相关文章

疯狂Java学习笔记(84)----------关于 Java 对象序列化您不知道的 5 件事

数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数程序员对于 Java 平台都是浅尝则止,只学习了足以完成手头上任务的知识而已.在本 系列 中,Ted Neward 深入挖掘 Java 平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程挑战. 大约一年前,一个负责管理应用程序所有用户设置的开发人员,决定将用户设置存储在一个 Hashta

疯狂Java学习笔记(84)----------大约 Java 对象序列化,你不知道 5 事

几年前,.当一个软件团队一起用 Java 书面申请.我认识比一般程序猿多知道一点关于 Java 对象序列化的知识所带来的优点. 关于本系列 您认为自己懂 Java 编程?其实,大多数程序猿对于 Java 平台都是浅尝则止,仅仅学习了足以完毕手头上任务的知识而已.在本 系列 中,Ted Neward 深入挖掘 Java 平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程挑战. 大约一年前,一个负责管理应用程序全部用户设置的开发者,决定将用户设置存储在一个 Hashtable中,然后将这

【web开发学习笔记】Struts-Tags学习笔记1 - 通用标签和控制标签

通用标签和控制标签 第一部分:代码 //前端 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> <title>Insert title here</title> </head> <body> 访问属性 <a href="<%=contextP

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com

EasyARM i.mx28学习笔记——通过modbus tcp控制GPIO

0 前言 本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机.在该从机中定义了线圈寄存器,其中线圈寄存器地址较低的4位和EasyARM的P2.4至P2.5关联,通过modbus指令可控制GPIO的输出.本文修改自freemodbus 示例LINUXTCP,经过简单的修改也可用于其他Linux开发板. [相关博文] [EasyARM i.mx28学习笔记--文件IO方式操作GPIO] [EasyARM i.mx28学习笔记--安装和使用tftp]

HTML5独家分享:原生JavaScript学习笔记2——程序流程控制

当当当当 .....楼主又来了!新一期的JS学习笔记2--程序流程控制更新了! 当当当当 .....楼主又来了!新一期的JS学习笔记2--程序流程控制更新了! 想一键获取全部JS学习笔记的可以给楼主留言哦! js中的程序控制语句 常见的程序有三种执行结构: 1. 顺序结构 2. 分支结构 3. 循环结构 顺序结构:程序从第一行开始执行,按顺序执行到最后一行 分支结构:就像一条岔路口,必须选择且只能选择其中一条道路继续走下去,不能同时执行两个分支里的代码. 我们可以使用如下三种方式来实现程序的分支

《深入Java虚拟机学习笔记》- 第5章 Java虚拟机

一.JVM的生命周期 当启动一个Java程序时,一个Java虚拟机实例就诞生了:当该程序关闭退出时,这个Java虚拟机也就随之消亡: JVM实例通过调用某个初始类的main方法来运行一个Java程序:这个main方法必须是public.static的,而且返回值必须是void:任何一个拥有这样的main方法的类都可以作为Java程序运行的起点: Java程序初始类中的main方法,将作为该程序初始线程的起点,其它任何线程都是由这个初始线程启动的: 守护线程和非守护线程 守护线程通常是由虚拟机自己

(yii学习笔记)控制器权限控制

public function filters() { return array( 'accessControl', // per 'postOnly + delete', // ); } public function accessRules() { return array( array('allow', // allow all users to pe 'actions'=>array('index','view'), 'users'=>array('*'), ), array('all