zoukankan      html  css  js  c++  java
  • Java中使用LUA脚本语言

    Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。简单介绍可详见:http://baike.baidu.com/view/416116.htm

    ·要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库。我使用的是一个叫做LuaJava的开源项目,可以在: http://www.keplerproject.org/luajava/ 找到LuaJava的类库以及源代码,使用文档资等下载下来解压后包括两个文件(:luajava-1.1.jar 文件和 luajava-1.1.dll动态连接库文件luajava-1.1.jar就容易了,就是将其加入你的项目的ClassPath中,以便程序可以使用它提供的APIluaJava-1.1.dll就麻烦了,你必须将其加入你的Windows安装目录下,比如你用的是XP,安装在C盘,那就直接将其加入C:\WINDOWS目录下即可,当然你也可以将其加入你的JDK下的jre下好了,现在你的项目就可以使用Lua脚本来实现动态扩展功能了!不过不要急,你还得有工具来写Lua脚本吧?不可能用记事本来写吧?你可以使用UltraEdit,但你用UE打开lua文件后,会发现和记事本差不多,并没有高亮(可能新版本的支持Lua脚本了),如果你的UE不支持,那么先去UltraEdit的官网下载支持Lua的Wordfiles文件(http://www.ultraedit.com/files/wf/lua.txt),是个文本文件(lua.txt)。打开UltraEdit安装目录下的wordfile.txt,把lua.txt文件中的内容拷贝粘贴到wordfile.txt的末尾,存盘,OK,于是UltraEdit语法高亮项多出Lua一项,可以选择使用了。其他语言的语法高亮支持与此类似。但你如果是Java开发者,应该都用过Eclipse吧?可否在Eclipse下直接就写Lua脚本呢?答案是可以的!

    这当然是Eclipse的强大的插件管理功能啦,你可以去下载luaeclipse插件来使你的Eclipse拥有编写Lua脚本的能力(既可以高亮显示你的脚本,是不是很爽呢),你可以在这里下载:http://www.ideais.com.br/luaeclipse/

    下载后安装后,你的Eclipse就可以建立和编写Lua脚本了,注意设置一下首选项中关于LUA的属性(Eclipse安装插件就不用我说了吧????)

    好了,现在一切都准备好了,让我们来一个HelloWorld吧!

    首先在Eclipse先建立一个TestLua项目,然后编写如下程序:

    import org.keplerproject.luajava.*;

    public class Hello
    {
        public static void main(String[] args)
        {
          LuaState L = LuaStateFactory.newLuaState();
          L.openLibs();    
          System.out.println("这里是Java程序调用Lua脚本");    
        
          // 加载脚本hello.lua,并执行
          L.LdoFile("res/hello.lua"); 
        }
    }


    好了,程序写完了,当然是保存为Hello.java咯,注意,这是Java代码!这是Java代码调用了一个叫hello.lua的脚本,下边是这个脚本文件的内容(你可以直接把他们复制到你的hello.lua文件中):

    ================================================================

    --基本方法
    print("您现在使用的是LUA脚本语言")
    print("让我们一起来感受它的奇妙吧!\n")

    --特点1,赋值
    a={1,2}
    b=a
    print(a==b, a~=b)    --输出 true, false
    a={1,2}
    b={1,2}
    print(a==b, a~=b)    --输出 false, true

    --特点2,交换
    a,b=1,2
    a,b=b,a
    print(a)
    print(b)

    print("连接".."字符串"..2^3)
    print(type(2))

    --while循环
    i=0
    print("while循环例子")
    while i<5
    do 
    print(i);
    i=i+1 
    end

    --repeat循环
    i=0
    print("repeat循环例子")
    repeat
    print(i)
    i=i+1
    until i>=5

    --for循环
    print("for循环例子")
    for i=0,5,1
    do
    print(i)
    end

    T1={}
    T1[1] = 10
    print(T1[1])

    function fun(a,b,...)
    print(a)
    print(b)
    print(arg[1])
    print(arg[2])
    print(arg[3])
    return
    end

    a,b=2,3
    fun(a,b,200,400,500)

    ========================================================

    好了,上边的脚本如果你不懂什么意思也没关系,直接运行一下吧

    你可以执行编译执行那个Hello.java程序就可以了,就会看到如下的输出结果:

    ========================================================

    这里是Java程序调用Lua脚本
    您现在使用的是LUA脚本语言
    让我们一起来感受它的奇妙吧!

    true false
    false true
    2
    1
    连接字符串8
    number
    while循环例子
    0
    1
    2
    3
    4
    repeat循环例子
    0
    1
    2
    3
    4
    for循环例子
    0
    1
    2
    3
    4
    5
    10
    2
    3
    200
    400
    500

    ==========================================================

    怎样,是不是很爽呢?觉得没意思?好,在来一段脚本吧:


    frame = luajava.newInstance("java.awt.Frame", "Lua Java Console")
    console = luajava.newInstance("java.awt.TextArea")
    buttons_pn = luajava.newInstance("java.awt.Panel")
    execute_bt = luajava.newInstance("java.awt.Button", "Execute")
    clear_bt = luajava.newInstance("java.awt.Button", "Clear")
    exit_bt = luajava.newInstance("java.awt.Button", "Exit")

    frame:setSize(600,300)

    buttons_pn:add(execute_bt)
    buttons_pn:add(clear_bt)
    buttons_pn:add(exit_bt)

    BorderLayout = luajava.bindClass("java.awt.BorderLayout")

    frame:add(BorderLayout.NORTH, console)
    frame:add(BorderLayout.SOUTH, buttons_pn)
    frame:pack()
    frame:show()

    --
    -- Listeners
    --

    execute_cb = { 
    actionPerformed = function(ev)
        print("execute")
        pcall(loadstring(console:getText()))
    end
    }

    jproxy = luajava.createProxy("java.awt.event.ActionListener",execute_cb)

    execute_bt:addActionListener(jproxy)


    clear_cb = {actionPerformed= function (ev)
        print("clear");
        console:setText("");
    end
    }

    jproxy = luajava.createProxy("java.awt.event.ActionListener" ,clear_cb)
    clear_bt:addActionListener(jproxy)

    exit_cb = { actionPerformed=function (ev)
    print("exit")
        frame:setVisible(false)
        frame:dispose()
    end
    }


    jproxyb = luajava.createProxy("java.awt.event.ActionListener" ,exit_cb)

    exit_bt:addActionListener(jproxyb)

    close_cb = {    }
    function close_cb.windowClosing(ev)
        print("close")
        frame:setVisible(false)
        frame:dispose()
    end

    function close_cb.windowActivated(ev)
        print("act")
    end

    jproxy = luajava.createProxy("java.awt.event.WindowListener", close_cb)
    frame:addWindowListener(jproxy)


    转自:http://blog.163.com/pzxii_001/blog/static/392586792007322103020971/

  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/blogyuan/p/3082354.html
Copyright © 2011-2022 走看看