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

c#的反射和特性

在 C# 中,反射(Reflection)和特性(Attributes)是两个强大的功能,它们在运行时提供元编程能力,广泛用于框架开发、对象映射和动态行为扩展。以下是对它们的详细介绍,包括定义、用法、示例和应用场景。


一、反射(Reflection)

什么是反射?

反射是 C# 运行时的一种机制,允许程序在运行时动态检查和操作类型、对象及其元数据(如类、方法、属性等)。通过反射,开发者可以:

  • 获取类型信息(如类名、方法名)。
  • 动态创建对象。
  • 调用方法或访问属性/字段。
  • 检查或修改私有成员(需注意权限)。

反射的核心类库位于 System.Reflection 命名空间。


反射的核心类和方法

  1. Type

    • 表示类型的元数据,是反射的核心。
    • 获取方式:
      • typeof(ClassName):静态获取类型。
      • object.GetType():从实例获取类型。
  2. Assembly

    • 表示程序集,可以加载和检查 DLL 或 EXE。
  3. MethodInfoPropertyInfoFieldInfo

    • 分别表示方法、属性和字段的元数据。
  4. Activator

    • 用于动态创建对象实例。

示例 1:基本反射操作

using System;
using System.Reflection;class Person
{public string Name { get; set; }private int age = 25;public void SayHello(){Console.WriteLine($"Hello, I'm {Name}, {age} years old.");}
}class Program
{static void Main(){// 获取类型Type type = typeof(Person);Console.WriteLine($"类名: {type.Name}");// 创建实例object instance = Activator.CreateInstance(type);// 设置属性PropertyInfo nameProp = type.GetProperty("Name");nameProp.SetValue(instance, "Alice");// 获取私有字段并修改FieldInfo ageField = type.GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);ageField.SetValue(instance, 30);// 调用方法MethodInfo method = type.GetMethod("SayHello");method.Invoke(instance, null);// 输出所有公共方法Console.WriteLine("\n公共方法:");foreach (MethodInfo m in type.GetMethods(BindingFlags.Public | BindingFlags.Instance)){Console.WriteLine(m.Name);}}
}
输出
类名: Person
Hello, I'm Alice, 30 years old.公共方法:
get_Name
set_Name
SayHello
ToString
Equals
GetHashCode
GetType
说明
  • typeof:获取 Person 的类型信息。
  • Activator.CreateInstance:动态创建实例。
  • GetPropertySetValue:访问和修改属性。
  • GetField:通过 BindingFlags 获取私有字段。
  • Invoke:动态调用方法。

示例 2:加载程序集

using System;
using System.Reflection;class Program
{static void Main(){// 加载当前程序集Assembly assembly = Assembly.GetExecutingAssembly();foreach (Type type in assembly.GetTypes()){Console.WriteLine($"类型: {type.FullName}");}}
}
输出
类型: Program
说明
  • Assembly.GetExecutingAssembly:获取当前程序集。
  • GetTypes:列出程序集中所有类型。

反射的优缺点

  • 优点
    • 动态性:运行时决定行为,适合插件系统或框架。
    • 灵活性:无需提前知道类型即可操作。
  • 缺点
    • 性能开销:反射比直接调用慢。
    • 安全性:可能暴露私有成员,需谨慎使用。

二、特性(Attributes)

什么是特性?

特性是 C# 中的一种声明性标签,用于为代码元素(如类、方法、属性等)附加元数据。特性在运行时可以通过反射读取,用于控制行为或提供额外信息。

特性定义在 System 命名空间中,常用基类是 Attribute


特性的定义与使用

  1. 定义特性

    • 继承自 Attribute,添加 [AttributeUsage] 指定适用范围。
  2. 应用特性

    • 使用方括号 [ ] 标记在代码元素上。
  3. 读取特性

    • 通过反射的 GetCustomAttributes 方法获取。

示例 1:自定义特性

using System;
using System.Reflection;// 定义特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class DescriptionAttribute : Attribute
{public string Description { get; }public DescriptionAttribute(string description){Description = description;}
}// 使用特性
[Description("这是一个测试类")]
class TestClass
{[Description("这是一个测试方法")]public void TestMethod(){Console.WriteLine("Hello from TestMethod!");}
}class Program
{static void Main(){// 获取类特性Type type = typeof(TestClass);DescriptionAttribute classAttr = (DescriptionAttribute)Attribute.GetCustomAttribute(type, typeof(DescriptionAttribute));Console.WriteLine($"类描述: {classAttr?.Description}");// 获取方法特性MethodInfo method = type.GetMethod("TestMethod");DescriptionAttribute methodAttr = (DescriptionAttribute)method.GetCustomAttribute(typeof(DescriptionAttribute));Console.WriteLine($"方法描述: {methodAttr?.Description}");// 调用方法object instance = Activator.CreateInstance(type);method.Invoke(instance, null);}
}
输出
类描述: 这是一个测试类
方法描述: 这是一个测试方法
Hello from TestMethod!
说明
  • [AttributeUsage]:限制特性只能用于类和方法,且不可重复。
  • GetCustomAttribute:获取指定类型的特性实例。
  • Description:特性中存储的元数据。

示例 2:内置特性 - [Obsolete]

using System;class Program
{[Obsolete("此方法已过时,请使用 NewMethod", false)] // false 表示警告,true 表示错误static void OldMethod(){Console.WriteLine("Old Method");}static void NewMethod(){Console.WriteLine("New Method");}static void Main(){OldMethod(); // 编译器会发出警告NewMethod();}
}
输出(带警告)
Old Method
New Method
说明
  • [Obsolete]:标记方法为过时,编译时提示开发者。

特性的应用场景

  1. 框架开发

    • ASP.NET Core 使用 [Route][HttpGet] 等特性定义路由和行为。
    • Entity Framework 使用 [Table][Key] 配置数据库映射。
  2. 验证与描述

    • [Required][MaxLength] 用于数据验证。
    • [Description] 添加文档信息。
  3. 条件编译

    • [Conditional("DEBUG")] 在特定条件下执行方法。

反射与特性的结合

反射和特性经常一起使用,例如:

  • 依赖注入:通过反射扫描带有特定特性的类,动态注入。
  • 序列化:检查 [Serializable] 或自定义特性,决定序列化字段。

优缺点

  • 优点
    • 声明式编程:减少硬编码,提高可维护性。
    • 元数据丰富:为工具和框架提供信息。
  • 缺点
    • 运行时开销:读取特性需要反射。
    • 复杂度:过度使用可能使代码难以理解。

总结

  • 反射:运行时动态操作类型和对象,适合需要灵活性的场景(如插件系统)。
  • 特性:为代码添加元数据,配合反射实现声明式逻辑(如框架配置)。

通过反射,你可以动态调用方法或创建实例;通过特性,你可以为代码附加规则或描述。这两者在 C# 中是构建高级功能(如 ORM、AOP)的基石。

相关文章:

c#的反射和特性

在 C# 中,反射(Reflection)和特性(Attributes)是两个强大的功能,它们在运行时提供元编程能力,广泛用于框架开发、对象映射和动态行为扩展。以下是对它们的详细介绍,包括定义、用法、…...

MaxEnt物种分布建模全流程;R+ArcGIS+MaxEnt模型物种分布模拟、参数优化方法、结果分析制图与论文写作

融合R语言的MaxEnt模型具有以下具体优势: 数据处理高效便捷 📊强大的数据预处理功能:R语言提供了丰富的数据处理工具,能够轻松完成数据清洗、筛选、转换等操作,为MaxEnt模型提供高质量的输入数据。 🌐自动…...

【AI插件开发】Notepad++插件开发实践:从基础交互到ScintillaCall集成

一、背景与目标 在文本编辑器领域,Notepad凭借其轻量级特性和强大的插件生态,成为开发者群体中的热门选择。作为基于Scintilla组件构建的编辑器(Scintilla是开源的代码编辑控件,被Notepad、Geany等知名工具广泛采用)&…...

TCP/IP协议的应用层与传输层

TCP/IP协议簇是互联网的核心通信框架,定义了数据如何在网络中封装、寻址、传输和路由(确定数据包从源主机到目标主机的传输路径的过程)。 应用层 直接面向用户和应用,负责实现网络服务的具体功能(如网页浏览、文件传输…...

CentOS与Ubuntu命令对比指南:从软件包管理到系统配置

CentOS与Ubuntu命令对比指南 作为两大主流Linux发行版,**CentOS(基于RHEL)和Ubuntu(基于Debian)**在日常运维中常因命令差异引发混淆。本文通过关键场景对比,助您快速掌握两者的核心操作区别。 一、软件包管理:yum/dnf vs apt 操作CentOSUbuntu更新软件源yum check-upd…...

python-leetcode 61.N皇后

题目: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击 给你一个整数 n ,返回所有不同的 n 皇后问题 的解…...

Scala 正则表达式

Scala 正则表达式 引言 正则表达式(Regular Expression)是一种强大的文本处理工具,在Scala编程语言中也有着广泛的应用。Scala正则表达式可以帮助开发者高效地进行字符串匹配、搜索、替换和解析等操作。本文将深入探讨Scala正则表达式的相关知识,包括语法、常用模式、匹配…...

【分布式】分布式限流方案解析

文章目录 固定窗口限流方案​实现方式​优点​缺点​ 滑动窗口限流方案​实现方式​优点​缺点​ 令牌桶限流方案​实现方式​优点​缺点​ 漏斗限流方案​实现方式​优点​缺点​ 在分布式系统蓬勃发展的当下,系统面临的流量挑战日益复杂。为确保系统在高并发场景下…...

Docker 拉取镜像部分成功部分失败?

🐋 Docker 拉取镜像部分成功部分失败?一次代理配置踩坑记录! 最近在部署 Zitadel 身份认证平台的过程中,遇到一个看似“随机”的问题:Docker 有些镜像可以拉取,有些却一直超时失败。最终通过配置 Docker 守…...

Spring AI Alibaba 对话记忆使用

一、对话记忆 (ChatMemory)简介 1、对话记忆介绍 ”大模型的对话记忆”这一概念,根植于人工智能与自然语言处理领域,特别是针对具有深度学习能力的大型语言模型而言,它指的是模型在与用户进行交互式对话过程中,能够追踪、理解并利…...

Mysql从入门到精通day5————子查询精讲

本文主要讲述子查询的几种方法,读者注意体会它们的不同场合的适用情况及功能,本篇文章也融入了小编实践过程遇到的坑,希望读者不要再踩坑 一.带IN关键字的子查询 in关键字可以检测结果集中是否存在某个特定的值,检测成功则执行外…...

QScreen 捕获屏幕(截图)

一、QScreen核心能力解析 硬件信息获取 // 获取主屏幕对象 QScreen* primaryScreen QGuiApplication::primaryScreen();// 输出屏幕参数 qDebug() << "分辨率:" << primaryScreen->size(); qDebug() << "物理尺寸:" << primar…...

Skyeye 云智能制造办公系统 VUE 版本 v3.15.15 发布

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…...

【最新】探索CFD的未来:从OpenFOAM到深度学习,全面解析计算流体力学的顶级资源与前沿技术

计算流体力学(CFD)作为现代工程与科学研究的核心工具,正以前所未有的速度迈向智能化与多物理场耦合的新时代。本文全面梳理了在线学习CFD的顶级资源,涵盖了从传统数值模拟到深度学习驱动的物理信息模型的广泛领域,旨在为研究者、工程师和学生提供一站式参考指南。内容分为…...

【QT5 网络编程示例】TCP 通信

文章目录 TCP 通信 TCP 通信 QT主要通过QTcpSocket 和 QTcpServer两个类实现服务器和客户端的TCP 通信。 QTcpSocket 是 Qt 提供的套接字类&#xff0c;看用于建立、管理和操作 TCP 连接。 常用方法 connectToHost(host, port)&#xff1a;连接到指定服务器。disconnectFro…...

QT五 文件系统,QFile,QfileInfo

总览 QIODevice&#xff1a;所有 I/O 设备类的父类&#xff0c;提供了字节块读写的通用操作以及基本接口&#xff1b;QFileDevice&#xff1a;Qt5新增加的类&#xff0c;提供了有关文件操作的通用实现。QFlie&#xff1a;访问本地文件或者嵌入资源&#xff1b;QTemporaryFile&a…...

OpenMCU(五):STM32F103时钟树初始化分析

概述 本文主要描述了STM32F103初始化过程系统时钟的初始化,主要描述了系统时钟的初始化&#xff0c;AHB总线时钟&#xff0c;APB总线时钟等的初始化。 硬件板卡3d图 时钟树 STM32F103的时钟树&#xff0c;如下所示: 时钟源选择 从STM32F103的时钟树框图&#xff0c;我们可以…...

docker save如何迁移镜像更节省空间?

文章目录 方法一&#xff1a;使用docker save命令方法二&#xff1a;直接保存多个镜像到一个tar文件哪个方法更节省磁盘空间&#xff1f;空间效率对比实际测试示例其他优势结论 如何用脚本迁移加载镜像 迁移镜像时候&#xff0c;往往会碰到基础镜像相同的很多镜像需要迁移&…...

在 UniApp 编译小程序时出现 `:class` 不支持 `getStatusClass(device.deviceStatus)` 语法的报错

在 UniApp 编译小程序时出现 :class 不支持 getStatusClass(device.deviceStatus) 语法的报错&#xff0c;这是因为在非 H5 平台&#xff0c;v-bind:class&#xff08;:class 是其简写形式&#xff09;里直接使用方法调用这种动态计算类名的方式可能不被支持。下面为你提供几种…...

Python之贪心算法

Python实现贪心算法(Greedy Algorithm) 概念 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致结果是全局最优的算法策略。 基本特点 局部最优选择&#xff1a;每一步都做出当前看起来最佳的选择不可回退&#xff1a;一旦做出选择&#xf…...

Javaweb后端AOP记录操作日志

日志记录表 提示词 切入点表达式&#xff0c;注解的方法 查询不用加上日志记录功能...

obsidian ios git同步

首先感谢几位博主的文章&#xff0c;我现在时间久了&#xff0c;未保存原文地址。以下是我自己的执行步骤总结。 应用商店安装 iSH 打开iSH&#xff0c;执行 apk update 安装下面软件&#xff0c;&#xff08;我觉得只安装第一个应该就行&#xff0c;下次测试&#xff09;。 …...

我的机器学习学习之路

学习python的初衷 • hi&#xff0c;今天给朋友们分享一下我是怎么从0基础开始学习机器学习的。 • 我是2023年9月开始下定决心要学python的&#xff0c;目的有两个&#xff0c;一是为了提升自己的技能和价值&#xff0c;二是将所学的知识应用到工作中去&#xff0c;提升工作…...

Python的ASGI Web 服务器之uvicorn

文章目录 什么是uvicornUvicorn 和 uWSGI 对比区别安装 Uvicorn使用示例 什么是uvicorn 官网https://www.uvicorn.org/ Uvicorn 是一个用于 Python 的 ASGI Web 服务器实现。 Until recently Python has lacked a minimal low-level server/application interface for async…...

Spring Boot分布式项目实战:装饰模式的正确打开方式

我在最近参与的物流中台项目中&#xff0c;面对复杂的分布式服务调用场景时&#xff0c;发现装饰模式&#xff08;Decorator Pattern&#xff09;竟成为提升系统扩展性的秘密武器。当某个基础服务接口需要同时支持缓存、日志、限流等多种能力时&#xff0c;传统的继承方式已难以…...

基于WebSocket的金融数据实时推送系统架构设计对接多国金融数据API

基于WebSocket的金融数据实时推送系统架构设计 ——高可用、低延迟与全球化数据支持的技术实践 一、实时数据推送的技术演进 在证券交易、外汇监控、量化策略等场景中&#xff0c;毫秒级延迟可能带来完全不同的业务结果。早期基于HTTP轮询的方案存在三大核心问题&#xff1a…...

Java虚拟机JVM知识点(已完结)

JVM内存模型 介绍下内存模型 根据JDK8的规范&#xff0c;我们的JVM内存模型可以拆分为&#xff1a;程序计数器、Java虚拟机栈、堆、元空间、本地方法栈&#xff0c;还有一部分叫直接内存&#xff0c;属于操作系统的本地内存&#xff0c;也是可以直接操作的。 详细解释一下 程…...

ffuf:一款高效灵活的Web模糊测试利器

在网络安全领域&#xff0c;模糊测试&#xff08;Fuzzing&#xff09;是一种强大的技术&#xff0c;用于发现系统中的隐藏功能、潜在漏洞或未公开资源。而在Web渗透测试中&#xff0c;ffuf&#xff08;Fast Fuzzing Tool&#xff09;凭借其高效性、灵活性和强大的自定义能力&am…...

深入理解二叉树、B树与B+树:原理、应用与实现

文章目录 引言一、二叉树&#xff1a;基础而强大的结构基本概念特性分析Java实现应用场景 二、B树&#xff1a;适合外存的多路平衡树基本概念关键特性查询流程示例Java简化实现典型应用 三、B树&#xff1a;数据库索引的首选核心改进优势分析范围查询示例Java简化实现实际应用 …...

NLP高频面试题(二十八)——Reward model是如何训练的,怎么训练一个比较好的Reward model

在强化学习领域&#xff0c;**奖励模型&#xff08;Reward Model&#xff09;是关键组件之一&#xff0c;旨在通过预测特定行为或输出的奖励值&#xff0c;指导智能体的学习方向。特别是在基于人类反馈的强化学习&#xff08;RLHF&#xff09;**中&#xff0c;奖励模型通过整合…...

基础算法篇(3)(蓝桥杯常考点)-图论

前言 这期是蓝桥杯常考点的最后一章了&#xff0c;其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图&#xff0c;一条路径的路径长度是指该路径上各边权值的总和 对于带权的图&#xff0c;一条路径长度时…...

【力扣hot100题】(017)矩阵置零

还是挺简单的&#xff0c;使用哈希表记录需要置换的行列即可&#xff0c;这样就可以避免重复节省时间。 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {unordered_set<int> row;unordered_set<int> line;for(int i0;i&l…...

量子退火与机器学习(2):少量实验即可找到新材料,黑盒优化➕量子退火

使用量子退火和因子分解机设计新材料 这篇文章是东京大学的一位博士生的毕业论文中的主要贡献。 结合了黑盒优化和量子退火&#xff0c;是融合的非常好的一篇文章&#xff0c;在此分享给大家。 https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.2.0133…...

Ubuntu 系统上完全卸载 CasaOS

以下是在 Ubuntu 系统上完全卸载 CasaOS 的详细步骤 一.卸载验证 二.卸载步骤 1.停止并禁用 CasaOS 服务 # 停止 CasaOS 核心服务 sudo systemctl stop casaos.service# 禁用开机自启 sudo systemctl disable casaos.service# 确认服务状态&#xff08;应显示 inactive&…...

Flutter敏感词过滤实战:基于AC自动机的高效解决方案

Flutter敏感词过滤实战&#xff1a;基于AC自动机的高效解决方案 在社交、直播、论坛等UGC场景中&#xff0c;敏感词过滤是保障平台安全的关键防线。本文将深入解析基于AC自动机的Flutter敏感词过滤实现方案&#xff0c;通过原理剖析实战代码性能对比&#xff0c;带你打造毫秒级…...

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…...

高精度加减乘除 + R 格式

蓝桥账户中心 高精度核心思路&#xff1a;使用vector存储每一位数&#xff0c;倒序存储&#xff0c;即数组从低到高存储的是个位数。 注意减法、乘法、除法都需要去掉前导零 加法&#xff1a; vector<int> add(vector<int> &A, vector<int> &B) …...

鸿蒙编译构建-多目标产物

此文章内容兼容API12&#xff0c;使用harmony next应用开发 前置概念介绍 1&#xff0c;配置文件介绍&#xff1a; build-profile.json5&#xff1a;modules字段&#xff0c;用于记录工程下的模块信息&#xff0c;主要包含模块名称、模块的源码路径以及模块的 target 信息oh-…...

从零开始:Windows 系统中 PowerShell 配置 FFmpeg 的详细步骤

在Windows系统中不想每次都 cd 到FFmpeg目录中应用&#xff0c;现在可以通过PowerShell在任意目录下应用了。 PowerShell 基础概念 跨平台脚本工具 PowerShell 是微软开发的命令行外壳和脚本语言&#xff0c;支持 Windows、Linux 和 macOS 系统。其核心优势在于面向对象的操作…...

Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

Spring Boot 支持多种日志框架&#xff0c;以下是详细介绍&#xff1a; 支持的日志框架 Logback Logback 是 Log4j 创始人设计的另一个开源日志组件&#xff0c;作为 Log4j 的改良版本&#xff0c;它具有更快的执行速度、更丰富的配置选项以及更好的性能。Logback 分为三个模块…...

【STM32单片机】#4 OLED调试外部中断

主要参考学习资料&#xff1a; B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装&#xff1a;STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…...

[7-02-02].第15节:生产经验 - 消费者相关操作

Kafka笔记大纲 五、生产经验——分区的分配以及再平衡: 4.1.生产经验——分区的分配以及再平衡 4.2.参数&#xff1a; 5.4.1 Range 以及再平衡...

cmd命令查看电脑的CPU、内存、存储量

目录 获取计算机硬件的相关信息的命令分别的功能结果展示结果说明获取计算机硬件的相关信息的命令 wmic cpu get name wmic memorychip get capacity wmic diskdrive get model,size,mediaType分别的功能 获取计算机中央处理器(CPU)的名称 获取计算机内存(RAM)芯片的容量…...

# OpenCV实现人脸与微笑检测:从图像到视频的实战应用

OpenCV实现人脸与微笑检测&#xff1a;从图像到视频的实战应用 在计算机视觉领域&#xff0c;人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例&#xff0c;详细介绍如何使用OpenCV实现人脸…...

k8s EmptyDir(空目录)详解

1. 定义与特性 emptyDir 是 Kubernetes 中一种临时存储卷类型&#xff0c;其生命周期与 Pod 完全绑定。当 Pod 被创建时&#xff0c;emptyDir 会在节点上生成一个空目录&#xff1b;当 Pod 被删除时&#xff0c;该目录及其数据会被永久清除。它主要用于同一 Pod 内多个容器间的…...

学习笔记—数据结构—二叉树(链式)

目录 二叉树&#xff08;链式&#xff09; 概念 结构 初始化 遍历 前序遍历 中序遍历 后序遍历 层序遍历 结点个数 叶子结点个数 第k层结点个数 深度/高度 查找值为x的结点 销毁 判断是否为完整二叉树 总结 头文件Tree.h Tree.c 测试文件test.c 补充文件Qu…...

STM32单片机的桌面宠物机器人(基于HAL库)

效果 基于STM32单片机的桌面宠物机器人 概要 语音模块&#xff1a;ASR PRO&#xff0c;通过天问block软件烧录语音指令 主控芯片&#xff1a;STM32F103C8T6 使用HAL库 屏幕&#xff1a;0.96寸OLED屏&#xff0c;用来显示表情 4个舵机&#xff0c;用来当作四只腿 底部一个面…...

ctf-web:命令注入 -- Cyber Apocalypse CTF 2025 月光的低语 Whispers of the Moonbeam

在瓦莱丽亚繁华的首都中心&#xff0c;Moonbeam Tavern 是一个热闹的耳语、赌注和非法交易的中心。在醉酒顾客的笑声和酒杯的叮当声下&#xff0c;据说这家酒馆不仅提供麦芽酒和欢乐——它是间谍、小偷和那些忠于马拉卡事业的人的秘密聚会场所。 护卫队了解到&#xff0c;在月光…...

如何自动化同义词并使用我们的 Synonyms API 进行上传

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词&#xff0c; 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…...

HCIA—— 31 HTTP的报文、请求响应报文、方法、URI和URL

学习目标&#xff1a; HTTP的报文、请求响应报文、方法、URI和URL 学习内容&#xff1a; HTTP报文——请求报文和响应报文&#xff1b;HTTP报文结构HTTP的---请求报文首部和响应报文首部方法URI和URL 目录 1.HTTP报文 1)HTTP的报文——请求报文和响应报文 HTTP协议的请求和响…...