当前位置: 首页 > news >正文

LuaJava

一、什么是LuaJava

LuaJava是一个Java脚本工具。该工具的目标是允许用Lua编写的脚本操纵用 Java开发的组件。LuaJava允许使用与访问Lua的本机对象相同的语法从Lua访问Java组件,而不需要任何声明或任何类型的预处理。

LuaJava还允许在Lua中实现任何Java接口,并将其作为参数传递给任何方法,当调用时,Lua中将调动等效函数,并将结果传递会Java。

LuaJava与Lua5.1的许可证相同,也就是说,它可以免费用于学术和商业目的。

二、Maven依赖引用
        <!-- https://mvnrepository.com/artifact/party.iroiro.luajava/luajava --><dependency><groupId>party.iroiro.luajava</groupId><artifactId>luajava</artifactId><version>4.0.2</version></dependency><!-- https://mvnrepository.com/artifact/party.iroiro.luajava/lua54 --><dependency><groupId>party.iroiro.luajava</groupId><artifactId>lua54</artifactId><version>4.0.2</version></dependency><!-- https://mvnrepository.com/artifact/party.iroiro.luajava/lua54-platform --><!--<dependency><groupId>party.iroiro.luajava</groupId><artifactId>lua54-platform</artifactId><version>4.0.2</version><type>pom</type></dependency>--><dependency><groupId>party.iroiro.luajava</groupId><artifactId>lua54-platform</artifactId><version>4.0.2</version><classifier>natives-desktop</classifier><scope>runtime</scope></dependency>
三、LuaJava包含两组Java API

围绕Lua C API的薄包装。因此,您需要对Lua C API有一些基本的了解。大多数API名称在驼峰命名法中被重命名,去掉lua_或luaL_前缀。

此外,如果您对API(这是Lua5.*版本之间的交叉点)不满意,可以通过Lua#getLuaNatives直接使用 Lua C API绑定。

更加Java话的API。这需要更少的Lua知识。请参阅Java API。

四、支持的Lua版本

支持的Lua版本有:Lua 5.1、Lua 5.2、Lua 5.3、Lua 5.4、LuaJ和LuaJIT。

五、Java API

Java API主要围绕着party.iroiro.luajava.Lua接口和party.iroiro.luajava.value.LuaValue接口设计。

首先,只需要使用以下任何构造函数获取Lua状态:

  • new Lua51()
  • new Lua52()
  • new Lua53()
  • new Lua54()
  • new LuaJit()
  • new LuaJ()

关闭状态:

Lua L = new Lua51();
// Operations
L.close();// Or
try (Lua J = new Lua51()) {// Operations
}

默认情况下,Lua状态仅由Java库加载。要使用string、table或coroutine,你需要显式打开这些库:

  • openLibraries 打开所有可用库;
  • openLibrary 打开指定的库;

要与Lua值交互,可以使用LuaValue接口或直接使用Lua C API绑定:

    @Testpublic void test(){try (Lua L = new Lua54()) {LuaValue[] returnValues = L.eval("return { a = 1 }, 1024, 'my string value'");assertEquals(3, returnValues.length);assertEquals(1, returnValues[0].get("a").toInteger());assertEquals(1024, returnValues[1].toInteger());assertEquals("my string value", returnValues[2].toString());}}

获取全局变量、设置全局变量:

    @Testpublic void getGlobalVar(){try(Lua lua = new Lua54()) {assertEquals("Lua 5.4", lua.get("_VERSION").toString());LuaValue value = lua.from(1);lua.set("a", value); // LuaValuelua.set("b", 2); // Java Integerlua.set("c", new BigDecimal(3)); // Any Java objectassertEquals(6,lua.eval("return a + b + c:longValue()")[0].toInteger());}}

要从简单的 Java值创建LuaValue,请使用Lua::from(boolean/double/long/String) 或 Lua::fromNull().

@Testpublic void getLuaValues() {try (Lua L = new Lua54()) {LuaValue value = L.from(1);L.set("a", value); // LuaValueL.set("b", 2); // Java IntegerL.set("c", new BigDecimal(3)); // Any Java objectassertEquals(6,L.eval("return a + b + c:longValue()")[0].toInteger());}}

要运行Lua代码并获取返回值,请使用Lua::eval(String)

    @Testpublic void getEval() {try (Lua L = new Lua54()) {L.openLibraries();LuaValue[] values1 = L.eval("string.sub('abcdefg', 0, 3)");assertEquals(0, values1.length);LuaValue[] values2 = L.eval("return string.sub('abcdefg', 0, 3)");assertEquals("abc", values2[0].toString());}}

LuaValues实现了Java Map接口,并允许直接操作Lua tables.

    @Testpublic void getTable() {try (Lua L = new Lua54()) {L.run("t = { text = 'abc', children = { 'a', 'b', 'c' } }");LuaValue table = L.eval("return t")[0];// Get-calls return LuaValues.assertEquals("abc", table.get("text").toString());LuaValue children = table.get("children");// Indices are 1-based.assertEquals("a", children.get(1).toString());assertEquals(3, children.size());// Set-calls accept LuaValues or any Java object.children.set(4, "d");// Changes are done in the Lua side.L.run("assert(t.children[4] == 'd')");}}

调用lua函数(使用LuaValue::call(…)调用函数并返回 LuaValue):

    @Testpublic void getLuaValue() {try (Lua L = new Lua54()) {L.openLibrary("string");LuaValue gsub = L.eval("return string.gsub")[0];LuaValue luaJava = gsub.call("Lua", "a", "aJava")[0];assertEquals("LuaJava", luaJava.toString());}}

使用LuaValue::toProxy创建java代理:

    @Testpublic void getRunnable() throws InterruptedException {try (Lua L = new Lua54()) {LuaValue runnable = L.eval("return { run = function() print('running...') end }")[0];Runnable r = runnable.toProxy(Runnable.class);Thread t = new Thread(r);t.start();t.join();}}

Lua GitHub:https://github.com/gudzpoz/luajava

Lua官方文档:https://gudzpoz.github.io/luajava/

开源SDK:https://github.com/mingyang66/spring-parent

相关文章:

LuaJava

一、什么是LuaJava LuaJava是一个Java脚本工具。该工具的目标是允许用Lua编写的脚本操纵用 Java开发的组件。LuaJava允许使用与访问Lua的本机对象相同的语法从Lua访问Java组件&#xff0c;而不需要任何声明或任何类型的预处理。 LuaJava还允许在Lua中实现任何Java接口&#x…...

Maven下载安装、环境配置(超详细)(包括Java环境配置(Windows)、在IDEA中配置Maven)

目录 一、引言 二、下载和安装 Maven &#xff08;1&#xff09;首先保证 Java 的环境是正常的。 1、电脑桌面上右击 " 此电脑 "&#xff0c;点击属性。 2、点击高级系统设置。 3、点击环境变量。 4、找到系统变量中的 Path。 5、点击新建&#xff0c;然后把想要配置…...

Python中的实例方法、静态方法和类方法三者区别?

1、实例方法 不用classmethod和staticmethod修饰的方法为实例方法。在类中定义的方法默认都是实例方法。实例方法最大的特点是它至少要包含一个self参数&#xff0c;用于绑定调用此方法的实例对象&#xff0c;实例方法通常可以用类对象直接调用。 2、类方法 采用classmethod…...

【学习Go编程】

了解Go语言的基本概念&#xff1a; 学习Go的基本语法、数据类型、控制结构等。可以参考官方文档或基础教程来入门。 安装Go环境&#xff1a; 访问Go语言的官方网站&#xff0c;下载并安装适合你操作系统的Go编程环境。配置好环境变量&#xff0c;确保可以在命令行中使用go命令…...

Linux系统:网络

目录 一、网络协议 1.网络协议概念 2.协议分层 3.OSI七层模型和TCP/IP五层&#xff08;或四层&#xff09;模型 4.为什么要有网络协议&#xff1f; 5.网络通信协议的原理 二、网络传输的基本流程 1.局域网的网络传输流程 1.MAC地址 2.局域网通信原理&#xff08;以太网…...

shodan2-批量查找CVE-2019-0708漏洞

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

面向对象(二)——类和对象(上)

1 类的定义 做了关于对象的很多介绍&#xff0c;终于进入代码编写阶段。 本节中重点介绍类和对象的基本定义&#xff0c;属性和方法的基本使用方式。 【示例】类的定义方式 // 每一个源文件必须有且只有一个public class&#xff0c;并且类名和文件名保持一致&#xff01; …...

Redis3——线程模型与数据结构

Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理&#xff0c;以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前&#xff0c;一个redis进程只有一个io线程&#xff0c;通过reactor模式可以连接大量客户端&#xff1b;redis6.0为了…...

linux 获取公网流量 tcpdump + python + C++

前言 需求为&#xff0c;统计linux上得上下行公网流量&#xff0c;常规得命令如iftop 、sar、ifstat、nload等只能获取流量得大小&#xff0c;不能区分公私网&#xff0c;所以需要通过抓取网络包并排除私网段才能拿到公网流量。下面提供了一些有效得解决思路&#xff0c;提供了…...

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…...

pytest(二)excel数据驱动

一、excel数据驱动 excel文件内容 excel数据驱动使用方法 import openpyxl import pytestdef get_excel():excel_obj openpyxl.load_workbook("../pytest结合数据驱动-excel/data.xlsx")sheet_obj excel_obj["Sheet1"]values sheet_obj.valuescase_li…...

python蓝桥杯刷题3

1.解方程组解 题解&#xff1a;首先让a&#xff0c;b&#xff0c;c进行遍历&#xff0c;然后计算得到1000时输出结果&#xff0c;其次考虑1000开根号是多大&#xff0c;计算得到32的倍数是1024&#xff0c;所有选择&#xff08;1&#xff0c;32&#xff09;进行遍历&#xff0c…...

基于PySpark 使用线性回归、随机森林以及模型融合实现天气预测

基于PySpark 实现天气预测与模型集成 在大数据分析与机器学习领域&#xff0c;Spark 提供了强大的计算能力和灵活的扩展性。本文将介绍如何利用 PySpark 完成以下任务&#xff1a; 1、数据预处理&#xff1a;清洗和编码天气数据。 2、特征工程&#xff1a;合并数值和分类特征…...

Day 30 贪心算法 part04

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙! 这种题还是属于那种,做过了也就会了,没做过就很难想出来。 不过大家把如下三题做了之后, 重叠区间 基本上差不多了 452. 用最少数量的箭引爆气球…...

dns实验3:主从同步-完全区域传输

服务器192.168.234.111&#xff08;主服务器&#xff09;&#xff0c;打开配置文件&#xff1a; 打开配置文件&#xff1a; 关闭防火墙&#xff0c;改宽松模式&#xff1a; 重启服务&#xff1a; 服务器192.168.234.112&#xff08;从服务器&#xff09;&#xff0c;打开配置文…...

数据结构 (20)二叉树的遍历与线索化

一、二叉树的遍历 遍历是对树的一种最基本的运算&#xff0c;所谓遍历二叉树&#xff0c;就是按一定的规则和顺序走遍二叉树的所有节点&#xff0c;使每一个节点都被访问一次&#xff0c;而且只被访问一次。二叉树的遍历方式主要有四种&#xff1a;前序遍历、中序遍历、后序遍历…...

【docker】Overlay网络

什么是 Overlay 网络&#xff1f; Overlay 网络是一种 Docker 网络驱动&#xff0c;允许容器在不同主机间通信。 它依赖分布式存储&#xff08;如 Swarm、Etcd 或 Consul&#xff09;来管理网络配置和路由。 Overlay 网络的核心特点 跨主机通信&#xff1a;容器可以跨物理主…...

基于智能语音交互的智能呼叫中心工作机制

在智能化和信息化不断进步的现代&#xff0c;智能呼叫中心为客户提供高质量、高效率的服务体验&#xff0c;提升众多品牌用户的满意度和忠诚度。作为实现智能呼叫中心的关键技术之一的智能语音交互技术&#xff0c;它通过集成自然语言处理&#xff08;NLP&#xff09;、语音识别…...

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…...

有趣的Docker

&#x1f449;【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中 1. Docker 上的“全世界”命令行 你可以在 Docker 容器中运行一个模拟的 “世界地图”&#xff0c;并通过命令行与它互动。这是一个非常有趣的项目&#xff0c;结合了命令行和图形界面的交互。…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...