Lua5.4.2常用API整理记录

一、基础函数

1.type(value)​​

返回值的类型(如 "nil", "number", "string", "table", "function" 等)。
代码测试:

a = 0
print(type(a))
a = nil
print(type(a))
a = "aaaaaaaa"
print(type(a))
a = {2,3,54}
print(type(a))
a = function() print("hello") end
print(type(a))

 结果:

​​2.tostring(value) / tonumber(value)​​

类型转换:将值转为字符串或数字。
代码测试:

a = "123"
b = tonumber(a)
print("原来的类型为"..type(a).."转换后的类型为"..type(b))
a = 122321312
b = tostring(a)
print("原来的类型为"..type(a).."转换后的类型为"..type(b))

结果:
 

 注:lua输出到控制台乱码时,需要将lua文件的编码格式设置为GBK格式

3.​​assert(condition, message)​​

断言:若条件为假,抛出错误并附带消息。
代码测试:

a = false
assert(a,"这是一个错误消息")

结果:

4.​​rawequal(a, b)​​

严格比较两个值是否相等(忽略元表的 __eq 方法)。
代码测试:

a = 10
b = 10
c = 11
d = "cccc"
print(rawequal(a,b))
print(rawequal(c,a))
print(rawequal(d,a))

结果:

5.rawget​​(table,key)

​​作用​​:直接获取表中指定键的值,(忽略元表的 __index 方法)​。
代码测试:

local t = {}
local mt = {__index = function() print("调用 __index 元方法")return "默认值"end
}
setmetatable(t, mt)print(t["不存在键"])      --> 输出:"调用 __index 元方法" → "默认值"
print(rawget(t, "不存在键")) --> 输出:nil(直接获取表中的值,不触发元方法)

结果: 

6.rawset​​(table,key,value)​​

作用​​:直接设置表中指定键的值,​​(忽略元表的 __newindex方法)。
代码测试:

local t = {}
local mt = {__newindex = function() print("调用 __newindex 元方法,拒绝写入!")return -- 阻止写入end
}
setmetatable(t, mt)t["新键"] = 10            --> 输出:"调用 __newindex 元方法,拒绝写入!"
print(t["新键"])          --> 输出:nilrawset(t, "新键", 10)     --> 绕过 __newindex,直接写入表的底层存储
print(t["新键"])          --> 输出:10

 结果:

7.​​_G​​

全局变量表(直接读写全局变量)
测试代码:

print(_G.myvalue)
_G.myvalue = 1000
print(_G.myvalue)print("------------------------------------")   for key, value in pairs(_G) doprint(key, value)
end

结果:
 

二、字符串处理

1.​​string.sub(s, start, end)​​

截取子字符串(支持负数索引)。
代码测试:

s = "hello world"
print(string.sub(s,1,5))
print(string.sub(s,-3,-1))

结果:

注意:

使用负索引时,开始索引要设置为较小的负索引,结束索引使用较大的负索引

2.string.find(s, pattern)​​

查找匹配模式的子串,返回位置。
代码测试:

s = "hello world"
print(string.find(s,"world"))

结果:

3.string.match(s, pattern)​​

返回第一个匹配模式的子串(支持捕获组)。
代码测试:

s = "hello world"
print(string.match(s,"world1"))
print(string.match(s,"world"))
print(string.match(s,"llo wor"))

结果:

4.​​string.gsub(s, pattern, replace)​​

全局替换匹配的子串(返回新字符串替换次数)。
代码测试:

s = "hello world"
print(string.gsub(s,"ll",2))

结果:

5.string.format(format, ...)​​

格式化字符串(类似 C 的 printf)。
代码测试:

print(math.pi)
print(string.format("PI: %.2f", math.pi))

结果:

三、表操作

1.​​table.insert(t, [pos,] value)​​

插入元素到数组末尾或指定位置。
代码测试:

local t = {1, 2}
table.insert(t, 3)       --> {1, 2, 3}
table.insert(t, 2, 99)   --> {1, 99, 2, 3}for key, value in pairs(t) doprint(key, value)
end

结果:

2.table.remove(t, [pos])​​

删除并返回数组末尾或指定位置的元素。
代码测试:

local t = {1, 2, 3}
table.remove(t) --> 3,t 变为 {1, 2}for key, value in pairs(t) doprint(key, value)
end

结果: 

3.table.concat(t, [sep], [i], [j])​​

将数组元素连接为字符串(默认分隔符为空)。
代码测试:

local t = {"a", "b", "c"}
print(table.concat(t, "-")) --> "a-b-c"

结果:

4.table.sort(t, [comp_func])​​

对数组排序(可自定义比较函数)。
代码测试:

local t = {3, 1, 4}
table.sort(t) --> {1, 3, 4}
for key, value in pairs(t) doprint(key, value)
end

结果:

5.​​#t 操作符​​

返回数组的连续部分长度(如果索引不连续则停止)。
代码测试:

local t = {1, 2, [5] = 3,[6] = 4}
print("t len = "..#t) local t1 = {1, 2, ["3"] = 3,[7] = 4}
print("t1 len = "..#t1) local t2 = {1, 2, nil,3,[6] = 4}
print("t2 len = "..#t2) local t3 = {1, 2, nil,nil,4}
print("t3 len = "..#t3) local t4 = {["1"] = 1, ["xxx"] = 2, nil,nil,["ccc"] = 4}
print("t4 len = "..#t4) local t5 = {["1"] = 1, ["xxx"] = 2, nil,nil,["ccc"] = 4,1,2,3}
print("t5 len = "..#t5) local t6 = {["1"] = 1, ["xxx"] = 2, ["ccc"] = 4,1,2,3}
print("t6 len = "..#t6) 

结果:
 

注:如果table中有显示声明为nil的元素还有索引连续的元素,则#t会将显示声明为nil的元素数量也加会到返回的长度中,如果只有显示声明为nil的元素没有索引连续的元素,则#t返回0

四、模块与包管理

1.require(modname)​​

加载模块(优先从 package.loaded 缓存中读取)。
新建一个lua文件
添加代码: 

local M = {}
function M.say_hello()print("Hello from mymodule!")
end
return M

测试代码: 

print(require("testlua2"))

结果: 

​​2.package.loaded[modname]

已加载模块的缓存表。
测试代码:

require("testlua2")
print(package.loaded["testlua2"])

结果: 

五、数学库

1.math.floor(x) / math.ceil(x)​​

向下/向上取整。
测试代码:

print(math.floor(3.9)) --> 3
print(math.ceil(3.1))  --> 4

结果:

2.math.random([m [, n]])​​

生成随机数(需先调用 math.randomseed)。
测试代码:

math.randomseed(os.time())
print("生成的随机数为:"math.random(1, 6)) -- 1~6 的随机整数

结果: 

3.math.abs(x) / math.max(x, ...) / math.min(x, ...)​​

绝对值、最大值、最小值。
测试代码:

print(math.abs(-10))
print(math.max(10, 20,-11,20,32))
print(math.min(10, 20,-11,20,32))

结果:
 

​​4.math.pi / math.sin(x) / math.cos(x)​​ / math.tan(x)

数学常量及三角函数。
测试代码:

print(math.pi)
print(math.sin(math.pi/2))
print(math.cos(math.pi/2))
print(math.tan(math.pi/2))

结果:

六、操作系统库

​​1.os.time([table])​​

返回当前时间戳或根据表生成时间戳。
测试代码:

print(os.time())
print(os.time(os.date("*t", os.time())))

结果:

2.​​os.date([format [, time]])​​

格式化时间戳为字符串(如 os.date("%Y-%m-%d"))。
测试代码:

local time_table = os.date("*t", os.time())  -- 返回table格式时间
print(string.format("当前时间: %d年%d月%d日", time_table.year, time_table.month, time_table.day))

​​​​结果:

3.​​os.execute(command)​​

执行系统命令(如 os.execute("ls"))。
测试代码:

--os.execute("sleep 1")  -- Linux/macOS
os.execute("timeout 1")  -- Windows
print("执行完成")

结果:

4.​​os.getenv(varname)​​

获取环境变量。
测试代码:

local path = os.getenv("PATH")
print("系统PATH变量:", path)

结果:

七、文件 I/O

1.io.open(filename, mode)​​

打开文件,返回文件句柄(模式如 "r", "w", "a")。
测试代码:

local file = io.open("data.txt", "r")
print(file)

​​​​结果:

注:
“r”:读取模式(默认);
“w”:写入模式;
“a”:附加模式;
“r+”: 更新模式,保留所有之前的数据;
“w+”:更新模式,之前的所有数据都被擦除;
“a+”:追加更新模式,保留之前的数据, 只允许在 file 末尾写入。

2.​file:read(format)​​

读取文件内容(如 "*a" 读取全部内容)。
新建一个data.txt文本文件,并在其中写入一点文字

测试代码:

local file = io.open("data.txt", "r")if file thenlocal data = file:read("*a")print(data)file:close()
end

结果:

3.​​file:write(...)​​

写入文件。
测试代码:

io.write("Hello", " ", "World\n")

结果:

4.​​io.stdin / io.stdout / io.stderr​​

标准输入/输出/错误流。
测试代码:

-- 示例:读取一行输入
io.stdout:write("请输入你的名字: ")
io.stdout:flush()  -- 确保提示信息立即显示
local name = io.stdin:read("*l")  -- 读取一行
if #name <= 3 thenio.stderr:write("错误:名字必须大于3个字符!\n")io.stderr:flush()return
end
print("你好," .. name)

​​​​​​结果:

八、协程

1.coroutine.create(func)​​

创建协程,返回线程对象。

2.​​coroutine.resume(co, ...)​​

启动或恢复协程。

3.​​coroutine.yield(...)​​

挂起协程,返回参数给 resume。

测试代码:

local co = coroutine.create(function()print("Start")coroutine.yield("Paused")print("End")
end)coroutine.resume(co) --> 输出 "Start",返回 true, "Paused"
coroutine.resume(co) --> 输出 "End",返回 true

​​​​​​​结果:

九、调试

1.debug.traceback ([thread,] [message [, level]])

获取当前调用栈信息(常用于错误处理)。
测试代码:

function risky_operation()error("模拟错误发生")
end-- 使用pcall包裹可能出错的代码
local success, err = pcall(risky_operation)
if not success thenprint("捕获到错误:", err)print("错误堆栈:\n", debug.traceback())
end
-- 输出包含错误信息和堆栈跟踪

​​​​​​​结果:

2.​​debug.getinfo ([thread,] f [, what])

获取函数信息(如源码位置、参数等)。
测试代码:

function funcA()funcB()
endfunction funcB()print("调用堆栈:")-- 打印堆栈信息(层级从0开始)local level = 2  -- 跳过当前函数和debug.getinfo自身while true dolocal info = debug.getinfo(level, "nSl")if not info then break endprint(string.format("层级%d: 函数 %s (文件 %s 第%d行)", level-1, info.name or "匿名", info.short_src, info.currentline))level = level + 1end
endfuncA()

​​​​​​​结果:

十、元表与元方法

1.setmetatable(t, metatable)​​

为表设置元表。
测试代码:

local t = {}
setmetatable(t, { __index = { default = 42 } })
print(t.default) --> 42(通过元表 __index 获取)

​​​​​​​结果:

2.​​getmetatable(t)​​

获取表的元表。
测试代码:

local t = {}
local mt = { __index = { default = 42 } }
setmetatable(t, mt)
print(getmetatable(t))
print(mt)

​​​​​​​结果:

​​3.__index / __newindex / __call 等元方法​​

Lua元表和元方法的使用_lua元方法有哪些-CSDN博客

十一、迭代器与遍历

1.​​pairs(t)​​

遍历表的键值对(包括非连续键),触发 __pairs 元方法。
测试代码:

local t = {1,2,3,4,["cccc"] = 5 ,nil,5,6,7,8,9,10}for key, value in pairs(t) doprint(key, value)
end

结果:
 

2.​​ipairs(t)​​

遍历数组部分的连续整数键(如 t[1], t[2],遇到 nil 停止)。
测试代码:

local t = {1,2,3,4,["cccc"] = 5 ,nil,5,6,7,8,9,10}
for key, value in ipairs(t) doprint(key, value)
end
print("----------------------")
local t1 = {1,2,3,4,["cccc"] = 5,5,6,7,8,9,10}
for key, value in ipairs(t1) doprint(key, value)
end

结果:
​​​​​​​

3.​​next(t, [key])​​

直接调用底层迭代函数,返回下一个键值对。
测试代码:

local t = {1,2,3,4,["cccc"] = 5 ,nil,5,6,7,8,9,10}print(next(t))
print(next(t, 5))
print(next(t, 11))
print(next(t, "cccc"))

结果:

十二、垃圾回收

1.collectgarbage("collect")​​

手动触发一次完整的垃圾回收。
测试例子可看弱表例子。

2.​​collectgarbage("count")​​

返回当前内存占用量(以 KB 为单位)。
测试代码:

t = {["dddd"] = 123,1,2,3}
print(collectgarbage("count")) 

​​​​​​​结果:

3.​​collectgarbage("step")​​

分步执行垃圾回收(适合实时性要求高的场景)。

十三、弱表

1.​​设置元表的 __mode 字段​​

控制表键/值的弱引用(如 {__mode = "k"} 表示键是弱引用)。
测试代码:

local weak_cache = setmetatable({}, { __mode = "v" })
weak_cache["data"] = true -- 当 data 无其他引用时自动清除for key, value in pairs(weak_cache) doprint(key, value)
end
print("-----------------------")
weak_cache["data"] = nil -- 手动清除 datacollectgarbage("collect") -- 强制垃圾回收for key, value in pairs(weak_cache) doprint(key, value)
end

​​​​​​​结果:

十四、错误处理

1.pcall(func, ...)​​

安全调用函数,返回是否成功及结果/错误消息。
代码测试:

function pcallTest(msg)print("错误消息为:"..msg)
endlocal ok, result = pcall(pcallTest, "Oops!")
print(ok) 
print(result) 

结果: 

代码测试:

function pcallTest(msg)print1("错误消息为:"..msg)
endlocal ok, result = pcall(pcallTest, "Oops!")
print(ok) 
print(result) 

结果:

2.xpcall(func, error_handler)​​

类似 pcall,但可指定自定义错误处理函数。
代码测试:

xpcall(function() print("xpcall测试") end, function(err) print("ERROR:", err) end)

结果: 

代码测试: 

xpcall(function() print1("xpcall测试") end, function(err) print("ERROR:", err) end)

结果: 

4.​​error(message)​​

抛出错误。
代码测试:

error("错误消息")

结果: 

十五、二进制数据处理 

1.​位运算​​

&, |, ~, <<, >> 等运算符(需整数类型)
测试代码:

local a = 1 << 3;
local b = 1 << 4;
local c = 1 << 3;
print(a)    
print(b)
print(c)
print("------------------")
print(a & b)
print(a | b)
print(a ~ b)
print("------------------")
print(a & c)
print(a | c)
print(a ~ c)

​​​​​​​结果:

2.​​string.pack(fmt, ...) / string.unpack(fmt, s)​​

打包或解包二进制数据(类似 C 的结构体)。
测试代码:

local packed = string.pack(">i4", 10234593) -- 大端序 4 字节整数
local num, offset = string.unpack(">i4", packed)
print(packed)
print(num) --> 12345
print(offset) --> 5 (跳过了 4 字节整数)

​​​​​​​结果:

十六、常用工具函数

1.select(index, ...)​​

获取可变参数的特定部分(select('#', ...) 返回参数数量)。
测试代码:

local count = select("#", 1, "a", true) --> 3
print(count)
local second = select(2, 1, 2, 3) --> 1
print(second)

​​​​​​​结果:

2.​​load(code) / loadfile(filename)​​

动态加载代码块或文件(返回函数或错误)。

新建一个calc.lua文件

return function(a, b) return a + b end

测试代码:

--加载字符串代码
local code = "return 1 + 2"
local func, err = load(code)
if func thenlocal result = func()print(result) -- 输出: 3
elseprint("加载失败:", err)
end-- 加载并执行文件中的代码
local func, err = loadfile("testlua2.lua")
if func thenlocal m = func() -- 执行文件代码,返回函数print(m.say_hello())   
elseprint("加载失败:", err)
end-- 加载并执行文件中的代码
local func, err = loadfile("calc.lua")
if func thenlocal add = func() -- 执行文件代码,返回函数print(add(2, 3))   -- 输出: 5
elseprint("加载失败:", err)
end

​​​​​​​结果:

十七、与C语言交互

在VS2022中使用Lua与c交互(二)_vs2022 lua d-CSDN博客

参考链接:

Lua 5.4 参考手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025.5.29 学习日记 docker概念以及基本指令

Docker&#xff1a; Docker 是一种开源的容器化平台&#xff0c;用于快速部署应用程序&#xff0c;实现开发、测试和生产环境的一致性。 一、Docker 核心概念 镜像&#xff08;Image&#xff09; 只读的模板文件&#xff0c;用于创建容器&#xff0c;类似虚拟机的镜像&#x…

明远智睿SSD2351开发板:语音机器人领域的变革力量

在人工智能快速发展的今天&#xff0c;语音机器人逐渐成为人们生活和工作中的得力助手。明远智睿SSD2351开发板凭借强大性能与丰富功能&#xff0c;为语音机器人的发展注入新动力&#xff0c;成为该领域的变革力量。 SSD2351开发板的四核1.4GHz处理器具备强劲的运算性能&#x…

嵌入式学习笔记 - keil安装目录下的头文件自动包含问题

Keil MDK/MDK-ARM&#xff08;ARM编译器&#xff09;默认情况下会自动包含其安装目录下的标准头文件路径&#xff08;如CMSIS库、设备头文件等&#xff09;。具体机制如下&#xff1a; ‌默认自动包含‌&#xff1a; 新建工程或使用设备数据库选择芯片型号后&#xff0c;Keil会…

什么是数据驱动?以及我们应如何理解数据驱动?

在谈到企业数字化转型时&#xff0c;很多人都会说起“数据驱动”&#xff0c;比如“数据驱动运营”、“数据驱动业务”等等。 在大家言必称“数据驱动”的时代背景下&#xff0c;我相信很多人并未深究和思考“数据驱动”的真正含义&#xff0c;只是过过嘴瘾罢了。那么&#xff…

C++中全局变量和局部变量的区别

C中全局变量和局部变量的区别 在C&#xff08;以及其他编程语言&#xff09;中&#xff0c;变量的作用域和生命周期是两个非常重要的概念。全局变量和局部变量在作用域和生命周期上有显著的区别。下面我将详细讲解全局变量和局部变量的区别&#xff0c;并通过代码示例来帮助理…

基于RPA技术的ECRobot企业智能体解决方案,打通企业自动化业务流程的最后一公里

在企业的日常运营中&#xff0c;难免会遇到一些繁琐且重复的任务&#xff0c;这类高频次、低复杂度的事务性工作往往造成人力资源和成本的浪费。因此如何通过智能化工具实现流程自动化&#xff0c;已经成为企业数字化转型进程中的共性课题。 RPA技术&#xff1a;自动化赋能企业…

ipv6与p2p的关系

在PCDN&#xff08;P2P内容分发网络&#xff09;领域&#xff0c;IPv6与PCDN盒子的关系紧密且相互影响&#xff0c;主要体现在以下几个方面&#xff1a; 一、IPv6的部署推动PCDN盒子普及 地址资源充足 IPv6采用128位地址&#xff0c;解决了IPv4地址枯竭的问题&#xff0c;为PC…

大模型应用开发之预训练

预训练是研发大语言模型的第一个训练阶段&#xff0c;通过在大规模语料上进行预训练&#xff0c;大语言模型可以获得通用的语言理解与生成能力&#xff0c;掌握较为广泛的世界知识&#xff0c;具备解决众多下游任务的性能潜力 一、数据预处理 1. 数据的收集 1&#xff09;通…

[python]Prophet‘ object has no attribute ‘stan_backend‘解决方法

测试环境&#xff1a; prophet1.1.4 写代码&#xff1a; from prophet import Prophet modelProphet() print(123) 在anaconda prompt里面没有报错&#xff0c;但是打开jupyter notebook会报错Prophet object has no attribute stan_backend&#xff0c;据此猜测jupyter应该…

【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 102 篇 - Date: 2025 - 05 - 31 Author: 郑龙浩/仟墨 文章目录 HTML 基础学习一 了解HTML二 HTML的结构三 HTML标签1 标题2 文本段落3 换行4 加粗、斜体、下划线5 插入图片6 添加链接7 容器8 列表9 表格10 class类 HTML 基础学习 一 了解HTML 一个网页分为为三部分&…

ansible中的inventory.ini 文件详解

1. 主机定义 主机是 Ansible 管理的最小单元&#xff0c;可以是 IP 或域名&#xff0c;支持直接定义或附加参数。 基础语法 # 直接定义主机&#xff08;IP 或域名&#xff09; 192.168.1.10 example.com# 定义主机并指定连接参数&#xff08;如端口、用户等&#xff09; web…

SpringBoot整合MyBatis完整实践指南

在Java企业级应用开发中&#xff0c;SpringBoot和MyBatis的组合已经成为主流的技术选型方案之一。本文将详细介绍如何从零开始搭建一个基于SpringBoot和MyBatis的项目&#xff0c;包括环境配置、数据库设计、实体类创建、Mapper接口编写以及实际应用等完整流程。 一、环境准备…

【Rust 轻松构建轻量级多端桌面应用】

使用 Tauri 框架构建跨平台应用 Tauri 是一个基于 Rust 的轻量级框架&#xff0c;可替代 Electron&#xff0c;用于构建高性能、低资源占用的桌面应用。其核心优势在于利用系统原生 WebView 而非捆绑 Chromium&#xff0c;显著减小应用体积。 安装 Tauri 需要先配置 Rust 环境…

【Linux】shell脚本的常用命令

目录 简介 一.设置主机名称 1.1通过文件修改 1.2通过命令修改 二.网络管理命令nmcli 2.1查看网卡 2.2设置网卡 三.简单处理字符 3.1seq打印连续字符 3.2printf,echo打印字符 3.3sort排序 3.4uniq冗余处理 3.5cut对字符的截取 四.xargs输入转参 简介 以下命令都是…

解决访问网站提示“405 很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断”问题

一、问题描述 本来前几天都可以正常访问的网站&#xff0c;但是今天当我们访问网站的时候会显示“405 很抱歉&#xff0c;由于您访问的URL有可能对网站造成安全威胁&#xff0c;您的访问被阻断。您的请求ID是&#xff1a;XXXX”&#xff0c;而不能正常的访问网站&#xff0c;如…

页面输入数据的表格字段(如 Web 表单或表格控件)与后台数据库进行交互时常用的两种方式

“从页面输入数据的表格字段(如 Web 表单或表格控件)在与后台数据库进行交互时,常用的有两种方式:” 🎯 两种方式(操作调用数据库、绑定数据) 🚀 方式1:前端代码提交数据到后端,再由后端调用数据库 💡 原理和逻辑: 用户在页面上(比如输入表单、表格)输入数据…

非阻塞套接字编程详解

阻塞与非阻塞套接字对比 传统阻塞式套接字编程使用ServerSocket和Socket类时,关键方法如connect()、accept()、read()、write()都会导致调用线程阻塞,直到操作完成。这种模式存在两个主要问题: 客户端线程在等待数据时会被完全阻塞服务端需要为每个客户端连接创建独立线程,…

电子电路:初步认识CMOS技术

CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff0c;互补金属氧化物半导体&#xff09;是一种半导体技术&#xff0c;广泛应用于集成电路&#xff08;IC&#xff09;的设计和制造中。以下是关于CMOS的详细说明&#xff1a; 1. 基本概念 技术原理&#xff1a…

【11408学习记录】考研英语写作提分秘籍:2013真题邀请信精讲+万能模板套用技巧

邀请信 英语写作2013年考研英语&#xff08;一&#xff09;真题小作文题目分析写作思路第一段&#xff1a;第二段&#xff1a;锦囊妙句1&#xff1a;锦囊妙句2&#xff1a;锦囊妙句3&#xff1a;锦囊妙句5&#xff1a;锦囊妙句6&#xff1a;锦囊妙句9&#xff1a;锦囊妙句14&am…

Java 注解与反射(超详细!!!)

Java 注解与反射&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 文章目录 Java 注解与反射&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09;1.注解1.1内置注解1.1.1 SuppressWarnings注解用法 1.2 元注解1.3自定义注解 2.反射2.1 反…