【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集
文章目录
- 前言
- 一、前置知识
- 1、编译器
- 2、程序集(`Assembly`)
- 3、元数据(`Metadata`)
- 二、反射
- 1、反射的概念
- 2、反射的作用
- 3、反射的核心`Type` 类
- 3.1 `Type` 类介绍
- 3.2 不同方法获取 `Type`
- 3.3 获取type类型所在的程序集的相关信息
- 4、反射的常见用法
- 4.1 获取 `Type`类型信息
- 4.2 获取类的公共成员
- 4.3 获取类的构造函数
- 4.4 获取类的字段
- 4.5 获取类的成员方法
- 4.6 其他反射操作
- 5、反射访问并操作私有(private)成员(包括字段、属性、方法等)
- 6、总结
- 三、关键类Assembly和Activator
- 1、**反射中的关键类**
- 1.1 `Type` 类(前面已经介绍过了)
- 1.2 `Assembly` 类
- 1.3 `Activator` 类
- 2、**使用 `Activator` 类实例化对象**
- 示例 1:无参构造函数
- 示例 2:带参数的构造函数
- 3、**使用 `Assembly` 类加载程序集**
- 3.1 加载程序集:
- (1)获取当前执行的程序集:
- (2)从指定路径加载程序集:
- 3.2 获取指定名称的类型
- 3.3 获取所有类型:
- 3.4 获取并调用类型中的方法:
- 4、综合示例
- 四、**总结**
- 专栏推荐
- 完结
前言
C# 反射 (Reflection) 是一种强大的机制,它允许程序在运行时动态地查看和操作程序的元数据。通过反射,我们可以在不事先知道类型信息的情况下,获取类型信息并操作类型中的成员(如类、方法、属性、字段等)。
一、前置知识
1、编译器
编译器是将源语言程序(如 C#、Java、C
等)翻译为目标语言程序(如机器代码或伪机器代码)的工具。源代码经过编译器的处理后,可以生成可执行文件
(.exe
) 或库文件
(.dll
) ,供程序运行时使用。
2、程序集(Assembly
)
程序集是经过编译器编译得到的中间产物,可以是一个库文件 (.dll
) 或可执行文件 (.exe
)。它是 .NET 程序中的代码集合,包含了类型、方法、属性等元数据,是程序执行的基础。
程序集就是我们写的一个代码集合,我们现在写的所有代码,最终都会被编译器翻译为一个程序集供别人使用。比如一个代码库文件(dll)或者一个可执行文件(exe)
我们新建一个C#项目,运行一次后,系统就会自动在bin目录里生成对应的程序集文件
3、元数据(Metadata
)
在C#中,元数据(Metadata)指的是描述程序及其组成部分(如类、方法、属性、字段等)的信息。它是关于代码的“数据”,但并不是实际执行的代码。可以将元数据视为程序代码的“数据字典”,它提供了有关类型、成员和引用等的信息,使得程序在运行时可以进行动态操作。
元数据是随代码一起编译成程序集(Assembly)的一部分,并且可以在运行时通过反射机制进行访问。
元数据是指有关程序结构和组成部分的描述信息,它不仅有助于程序的运行时类型检查,还为反射、动态加载等功能提供了支持。在C#中,元数据通常存储在程序集
文件中,并可以通过反射机制访问和操作。
二、反射
1、反射的概念
反射允许程序在运行时查看其他程序集
或自身的元数据
,动态获取类型信息并对其进行操作。例如,通过反射可以查看类的构造函数、方法、字段、属性等,甚至可以在运行时动态创建对象并调用方法。
2、反射的作用
- 程序运行时获取类型信息:反射可以帮助我们动态获取类、方法、字段等的元数据信息。
- 动态操作对象:反射使得我们可以动态实例化对象,调用方法,修改字段值等。
- 增强灵活性:反射使得代码更加灵活,尤其在插件机制、依赖注入等场景下尤为重要。
3、反射的核心Type
类
3.1 Type
类介绍
Type
类是反射的基础,它提供了关于类的所有信息,例如类的名称、构造函数、方法、字段、属性等。它是访问元数据的主要方式。
3.2 不同方法获取 Type
-
通过对象的
GetType()
方法获取:int a = 42; Type type = a.GetType(); Console.WriteLine(type); // 输出: System.Int32
-
通过
typeof
关键字获取:Type type = typeof(int); Console.WriteLine(type); // 输出: System.Int32
-
通过类的全名获取:
Type type = Type.GetType("System.Int32"); Console.WriteLine(type); // 输出: System.Int32
其实就是
命名空间.类名
3.3 获取type类型所在的程序集的相关信息
Console.WriteLine(type.Assembly);
打印
System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
- System.Private.CoreLib 是程序集的名称。(通常是 .exe 或 .dll 文件的名称)
- Version=9.0.0.0 是程序集的版本。
- Culture=neutral 表示它是通用区域设置的。(如果是通用语言程序集,则为 neutral)。
- PublicKeyToken=7cec85d7bea7798e 是公共密钥标识符。(用于区分同名的不同程序集版本)。
4、反射的常见用法
为了方便测试反射的常见用法,这里我先新增一个简单的类,里面包含基本的构造函数、方法、字段、属性。
ps
:这里只是测试探究,实际开发肯定不需要通过反射来操作自己的类。
class Test
{private int i = 1;public int j = 2;public int k { get; set; }public string str = "向宇的客栈";public Test() { }public Test(int i){this.i = i;}public Test(int i, string str) : this(i){this.str = str;}public void Log(){Console.WriteLine("学习C#");}
}
4.1 获取 Type
类型信息
Type t = typeof(Test);// 获取类型信息
4.2 获取类的公共成员
使用 GetMembers()
方法获取类中的所有公共成员:
MemberInfo[] infos = t.GetMembers();
foreach (var info in infos)
{Console.WriteLine(info);
}
打印结果
可以看到,除了万物之父(object
)中的方法,打印出来的都是我们前面Test类中定义的公共成员信息(构造函数、方法、字段、属性)。
4.3 获取类的构造函数
- 获取所有构造函数:
ConstructorInfo[] ctors = t.GetConstructors();
foreach (var ctor in ctors)
{Console.WriteLine(ctor);
}
结果
- 获取无参构造函数并调用:
ConstructorInfo ctor = t.GetConstructor(Type.EmptyTypes);
Test obj = (Test)ctor.Invoke(null);
Console.WriteLine(obj);
- 获取有参构造函数并调用:
ConstructorInfo ctor = t.GetConstructor(new Type[] { typeof(int), typeof(string) });
Test obj = (Test)ctor.Invoke(new object[] { 10, "Hello" });
Console.WriteLine(obj);
4.4 获取类的字段
- 获取所有公共字段:
FieldInfo[] fieldInfos = t.GetFields();
foreach (var field in fieldInfos)
{Console.WriteLine(field);
}
结果
- 获取指定字段:
FieldInfo fieldInfo = t.GetField("j");
Console.WriteLine(fieldInfo);
结果
- 使用反射获取和设置字段的值:
FieldInfo fieldInfo = t.GetField("j");
Test test = new Test();
test.j = 99;
fieldInfo.SetValue(test, 100);
Console.WriteLine(fieldInfo.GetValue(test)); // 输出: 100
4.5 获取类的成员方法
- 获取所有公共方法(记得引入
using System.Reflection;
反射命名空间):
using System.Reflection;MethodInfo[] methods = t.GetMethods();
foreach (var method in methods)
{Console.WriteLine(method);
}
- 获取指定方法并调用:
MethodInfo method = t.GetMethod("ToString");
object result = method.Invoke(test, null);
Console.WriteLine(result);
- 对于方法重载,需要提供方法的参数类型:
MethodInfo method = t.GetMethod("Substring", new Type[] { typeof(int), typeof(int) });
object result = method.Invoke("Hello, World!", new object[] { 7, 5 });
Console.WriteLine(result); // 输出: World
4.6 其他反射操作
-
枚举:
获取枚举类型的名称:Enum.GetEnumName(typeof(DayOfWeek), 1); // 输出: Monday
-
事件:
获取类的事件:EventInfo eventInfo = t.GetEvent("MyEvent"); Console.WriteLine(eventInfo);
-
接口:
获取类实现的接口:Type[] interfaces = t.GetInterfaces(); foreach (var iface in interfaces) {Console.WriteLine(iface); }
-
属性:
获取类的属性:PropertyInfo[] properties = t.GetProperties(); foreach (var property in properties) {Console.WriteLine(property); }
5、反射访问并操作私有(private)成员(包括字段、属性、方法等)
在默认情况下,反射是可以访问私有成员的,但你必须明确告诉 .NET 你要访问它们。具体来说,你需要使用 BindingFlags 来指定访问私有成员。
例如,默认情况下,反射会忽略私有字段和方法,但你可以通过显式地指定 BindingFlags.NonPublic
和 BindingFlags.Instance
来让反射能够访问这些私有成员。
示例
// 创建 MyClass 的实例
MyClass myObject = new MyClass();// 获取 MyClass 类型的信息
Type type = typeof(MyClass);// 使用反射访问私有字段 secretValue
FieldInfo fieldInfo = type.GetField("secretValue", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldInfo != null)
{// 获取字段的值var value = fieldInfo.GetValue(myObject);Console.WriteLine("Private Field 'secretValue' Value: " + value);
}// 使用反射访问私有方法 PrintSecret
MethodInfo methodInfo = type.GetMethod("PrintSecret", BindingFlags.NonPublic | BindingFlags.Instance);
if (methodInfo != null)
{// 调用私有方法methodInfo.Invoke(myObject, null);
}
这种机制虽然强大,但应谨慎使用,避免破坏封装性,尤其是在生产环境中。这种做法通常用于调试、测试、动态代理等特殊场景。
6、总结
C# 中的反射为程序提供了强大的动态能力,通过 Type
类及其提供的方法,我们可以在运行时获取类型的元数据,动态创建对象,调用方法,甚至修改字段值。
虽然反射提供了灵活性,但是反射的性能较差
,因为它是动态查找和操作的。如果频繁使用反射,可能会影响程序性能,尤其是在处理大量数据时。因此应该在合适的场合使用反射,并考虑到性能和可维护性。
三、关键类Assembly和Activator
反射(Reflection)是 C# 中一个非常强大的机制,它允许在运行时访问和操作程序中的类型信息。通过反射,程序可以在运行时动态地获取类、方法、属性等信息,并实例化对象、调用方法、访问字段等。下面是对 Assembly
和 Activator
这两个关键类的详细介绍和相关用法。
1、反射中的关键类
1.1 Type
类(前面已经介绍过了)
Type
类提供了对类型信息的访问,它是所有类型的元数据的基础。通过 Type
对象,你可以获取类的构造函数、属性、字段、方法等信息。
1.2 Assembly
类
Assembly
类用于加载和操作程序集。程序集包含了类、接口、枚举等信息,反射可以用来加载程序集,并且在程序运行时查找类型和操作它们。
1.3 Activator
类
Activator 类位于 System 命名空间下,提供了一组静态方法来创建类型的实例。它常用于在运行时通过反射动态创建对象,特别是在我们事先不知道具体类型的情况下。例如,依赖注入、插件加载、对象池等场景中,可以使用 Activator 来动态实例化对象。
2、使用 Activator
类实例化对象
Activator
提供了几种创建对象的方法,最常用的是 CreateInstance
,它可以用来根据 Type
对象动态创建实例。
示例 1:无参构造函数
假设有一个类 Test
,它有一个无参构造函数。你可以使用 Activator.CreateInstance
来创建该类的实例。
using System;public class Test
{public string str = "Hello, World!";
}class Program
{static void Main(){// 获取 Test 类的 Type 对象Type testType = typeof(Test);// 使用 Activator 创建对象实例Test testobj = Activator.CreateInstance(testType) as Test;// 输出结果Console.WriteLine(testobj.str); // Output: Hello, World!}
}
示例 2:带参数的构造函数
如果类有带参数的构造函数,可以使用 Activator.CreateInstance
方法传递参数来创建实例。
using System;public class Test
{public int j;public string str;// 构造函数public Test(int j, string str){this.j = j;this.str = str;}
}class Program
{static void Main(){Type testType = typeof(Test);// 使用带参数的构造函数Test testobj1 = Activator.CreateInstance(testType, 99, "Hello") as Test;Console.WriteLine(testobj1.j); // Output: 99Console.WriteLine(testobj1.str); // Output: HelloTest testobj2 = Activator.CreateInstance(testType, 55, "World") as Test;Console.WriteLine(testobj2.j); // Output: 55Console.WriteLine(testobj2.str); // Output: World}
}
3、使用 Assembly
类加载程序集
前面我们一直都是对当前程序的操作,实际开发肯定是操作外部程序集。Assembly
类使得我们可以在运行时加载、查询、获取外部程序集的类型信息等。
常用方法:
GetExecutingAssembly()
:获取当前执行的程序集。LoadFrom(string path)
:从指定路径加载程序集。GetTypes()
:获取程序集中的所有类型。GetType(string typeName)
:获取指定名称的类型。GetManifestResourceNames()
:获取程序集中的所有嵌入式资源名称。
3.1 加载程序集:
(1)获取当前执行的程序集:
Assembly assembly = Assembly.GetExecutingAssembly();
Console.WriteLine("当前程序集: " + assembly.FullName);
(2)从指定路径加载程序集:
Assembly assembly = Assembly.LoadFrom("path/to/your/assembly.dll");
Console.WriteLine("加载程序集: " + assembly.FullName);
3.2 获取指定名称的类型
Assembly assembly = Assembly.LoadFrom("path/to/your/assembly.dll");
Type type = assembly.GetType("Namespace.ClassName"); // 获取程序集中的某个类型
Console.WriteLine("类型名称: " + type.FullName);
3.3 获取所有类型:
Assembly assembly = Assembly.LoadFrom("path/to/your/assembly.dll");
Type[] types = assembly.GetTypes();
foreach (Type t in types)
{Console.WriteLine(t.FullName); // 输出程序集中的所有类型
}
3.4 获取并调用类型中的方法:
其实就是结合前面Type知识配合使用
Assembly assembly = Assembly.LoadFrom("path/to/your/assembly.dll");
Type type = assembly.GetType("Namespace.ClassName");
MethodInfo methodInfo = type.GetMethod("MethodName");
object result = methodInfo.Invoke(null, null); // 调用静态方法
Console.WriteLine(result);
4、综合示例
我这里项目的程序集文件路径为:C:\Users\zw\Desktop\C#\bin\Debug\net9.0\C#.dll
程序集文件里主要的代码是,我自定义了一个Test类
代码
using System;
using System.Reflection;class Program
{static void Main(){// 加载程序集(因为是反斜杠,所以加个@不希望它转义)Assembly assembly = Assembly.LoadFrom(@"C:\Users\zw\Desktop\C#\bin\Debug\net9.0\C#.dll");// 获取程序集中的所有类型Type[] types = assembly.GetTypes();foreach (var type in types){Console.WriteLine(type.Name);}// 获取程序集中的一个具体类型Type testType = assembly.GetType("Test");// 使用反射实例化对象object myClassObj = Activator.CreateInstance(testType);// 获取并调用方法MethodInfo method = testType.GetMethod("Log");method.Invoke(myClassObj, null);// 获取指定字段并打印值FieldInfo field1 = testType.GetField("str");Console.WriteLine(field1.GetValue(myClassObj));// 获取指定字段,先修改值,在打印值FieldInfo field2 = testType.GetField("j");field2.SetValue(myClassObj, 100);Console.WriteLine(field2.GetValue(myClassObj));}
}
结果,程序集里的方法被执行,字段也被打印了(Program
类和E_Days
枚举是定义的其他两个测试数据,不用管即可)
四、总结
Type
:提供关于类、接口、枚举等类型的信息。Assembly
:用于加载程序集,可以获取程序集中的所有类型和类型成员信息。Activator
:用于在运行时动态创建对象实例,支持无参数和带参数构造函数。- 反射虽然非常强大,但会影响性能,因此在需要时使用,避免过度依赖。
专栏推荐
地址 |
---|
【从零开始入门unity游戏开发之——C#篇】 |
【从零开始入门unity游戏开发之——unity篇】 |
【制作100个Unity游戏】 |
【推荐100个unity插件】 |
【实现100个unity特效】 |
【unity框架开发】 |
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
相关文章:
【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集
文章目录 前言一、前置知识1、编译器2、程序集(Assembly)3、元数据(Metadata) 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…...
如何启动CentOS6远程服务器和进行ssh远程登录?
如何启动CentOS 6远程服务器? 在CentOS 6中,启动远程服务器通常涉及到配置SSH服务和VNC服务,以下是详细的步骤: 配置SSH服务 确认是否安装SSH 首先需要检查系统中是否已经安装了SSH服务,打开终端并输入以下命令&am…...
面向机器学习的Java库与平台
学习Java语言中与机器学习相关的各种库与平台,了解每个库的功能,以及可以用它 们解决的问题。 实现机器学习应用时需要具备的Java环境 Weka:一个通用的机器学习平台 Java机器学习库:一系列机器学习算法 Apache Mah…...
AI大模型语音识别转文字
提取音频 本项目作用在于将常见的会议录音文件、各种语种音频文件进行转录成相应的文字,也可从特定视频中提取对应音频进行转录成文字保存在本地。最原始的从所给网址下载对应视频和音频进行处理。下载ffmpeg(https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-…...
GAN对抗生成网络(一)——基本原理及数学推导
1 背景 GAN(Generative Adversarial Networks)对抗生成网络是一个很巧妙的模型,它可以用于文字、图像或视频的生成。 例如,以下就是GAN所生成的人脸图像。 2 算法思想 假如你是《古董局中局》的文物造假者(Generator,生成器)&a…...
LeetCode - 初级算法 数组(旋转数组)
旋转数组 这篇文章讨论如何通过编程实现数组元素的旋转操作。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例: 输入: nums = [1,2,3,...
目标检测入门指南:从原理到实践
目录 1. 数据准备与预处理 2. 模型架构设计 2.1 特征提取网络原理 2.2 区域提议网络(RPN)原理 2.3 特征金字塔网络(FPN)原理 2.4 边界框回归原理 2.5 非极大值抑制(NMS)原理 2.6 多尺度训练与测试原理 2.7 损失函数设计原理 3. 损失函数设计 4. 训练策略优化 5. 后…...
连接github和ai的桥梁:GitIngest
Git ingest GitIngest - 将任何 Github 仓库转变为适合 LLM 的友好型提示文本 (https://github.com/cyclotruc/gitingest) 输入 Github 地址或者名称,GitIngest 就会提供该仓库的总结、目录结构、仓库内容的文本内容 你可以复制这些文本与 AI 大模型更好地对话...
百度贴吧的ip属地什么意思?怎么看ip属地
在数字化时代,IP地址不仅是网络设备的唯一标识符,更承载着用户的网络身份与位置信息。百度贴吧作为广受欢迎的社交平台,也遵循相关规定,在用户个人主页等位置展示账号IP属地信息。那么,百度贴吧的IP属地究竟意味着什么…...
5.系统学习-PyTorch与多层感知机
PyTorch与多层感知机 前言PyTroch 简介张量(Tensor)张量创建张量的类型数据类型和 dtype 对应表张量的维度变换:张量的常用操作矩阵或张量计算 Dataset and DataLoaderPyTorch下逻辑回归与反向传播数据表格 DNN(全连结网络&#x…...
wpf 基于Behavior库 的行为模块
Microsoft.Xaml.Behaviors 是一个用于WPF(Windows Presentation Foundation)的行为库,它的主要作用是允许开发者在不修改控件源代码的情况下,为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件&…...
【一文解析】新能源汽车VCU电控开发——能量回收模块
一、概述 VCU(Vehicle Control Unit,整车控制器)能量回收功能是新能源汽车(如纯电动汽车和混合动力汽车)中非常重要的一个环节。它主要是在车辆减速或制动过程中,将车辆的部分动能转化为电能,并…...
鸿蒙TCPSocket通信模拟智能家居模拟案例
效果图 一、智能家居热潮下的鸿蒙契机 在当下科技飞速发展的时代,智能家居已如浪潮般席卷而来,深刻地改变着我们的生活方式。从能依据环境光线自动调节亮度的智能灯具,到可远程操控、精准控温的智能空调,再到实时监测健康数据的智…...
【Spring Boot 实现 PDF 导出】
Spring Boot 实现 PDF 导出 在Spring Boot应用程序中实现PDF导出功能,可以选择多种库和技术栈。每种方法都有其优缺点,适用于不同的场景。以下是四种常见的方式:iText、Apache PDFBox、JasperReports 和 Thymeleaf Flying Saucer。我将详细…...
【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)
我们在写selenium获取网络信息的时候,有时候我们会受到对方浏览器的监控,对方通过分析用户行为模式,如点击、滚动、停留时间等,网站可以识别出异常行为,进而对Selenium爬虫进行限制。 这里我们可以加入JavaScript的使…...
leetcode hot 100 前k个高平元素
347. 前 K 个高频元素 已解答 中等 相关标签 相关企业 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 class Solution(object):def topKFrequent(self, nums, k):""":type nums: Lis…...
数据结构漫游记:静态双向链表
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
Object.defineProperty() 完整指南
Object.defineProperty() 完整指南 1. 基本概念 Object.defineProperty() 方法允许精确地添加或修改对象的属性。默认情况下,使用此方法添加的属性是不可修改的。 1.1 基本语法 Object.defineProperty(obj, prop, descriptor)参数说明: obj: 要定义…...
1Panel自建RustDesk服务器方案实现Windows远程macOS
文章目录 缘起RustDesk 基本信息实现原理中继服务器的配置建议 中继服务器自建指南准备服务器安装1Panel安装和配置 RustDesk 中继服务防火墙配置和安全组配置查看key下载&安装&配置客户端设置永久密码测试连接 macOS安装客户端提示finder写入失败hbbs和hbbr说明**hbbs…...
nginx学习之路-windows系统安装nginx
文章目录 1. 下载2. 启动3. 验证参考文档 1. 下载 官方下载地址:https://nginx.org/en/download.html 可以下载windows版本,如nginx-1.26.2.zip。解压后,加入系统变量。 2. 启动 可以使用命令行启动(windows系统自带的cmd可能…...
Paimon_01_241020
1. 概述 1.1. 核心特点 统一批处理和流处理(流和批同一套代码)数据湖能力多种引擎平权变更日志生成丰富的表类型(主键表、append-only,有序的流式读取来代替消息队列)模式演化(schema变更) 1…...
人工智能:变革时代的核心驱动力
求各位观众老爷看一看 先声明一下,该内容由于篇幅过长,可能会有一些地方存在一些小问题请大家谅解 观众老爷们,点个免费的赞和关注呗,您们的支持就是我最大的动力~ 人工智能:变革时代的核心驱动力 一、引言 在当今…...
【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...
数据分析-Excel
数据类型和函数初步 Excel中有文本类型和数值类型–但是无法用肉眼分辨出来isnumber来区分是否是数值类型text和value函数可以完成数值类型以及文本类型的转换单元格第一位输入’方式明确输入的是文本sum函数必须是数值类型 文本连接-and-or-not-if-mod-max函数 字符串的连接…...
Kubernetes第二天
1.pod运行一个容器 1.创建目录 mkdir -p /manifests/pod 2.编写pod资源清单文件 vim 01-myweb.yaml 说明: apiVersion:指的是Api的版本 metadata:资源的元数据 spec:用户期望的资源的运行状态 status:资源实际的运行状态 由于拉取远…...
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
💬 欢迎讨论:如对文章内容有疑问或见解,欢迎在评论区留言,我需要您的帮助! 👍 点赞、收藏与分享:如果这篇文章对您有所帮助,请不吝点赞、收藏或分享,谢谢您的支持&#x…...
Kerberos用户认证-数据安全-简单了解-230403
hadoop安全模式官方文档:https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html kerberos是什么 kerberos是计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。 概念&#…...
大中厂面试经验分享:如何使用消息队列(MQ)解决系统问题
在大中型互联网公司中,消息队列(MQ)作为一种关键的分布式系统组件,广泛应用于解决系统中的高并发、异步处理、解耦等问题。 在面试中,尤其是针对后端工程师或系统架构师的职位,面试官常常会通过询问消息队列…...
c#String和StringBuilder
目录 一,String 1,string的特点: 2,string常用方法 (1)Length (2)Substring() (3)ToUpper() (4)ToLower() (5&…...
【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制
深入详解强化学习之常用算法:Q-Learning与策略梯度 强化学习(Reinforcement Learning, RL)作为机器学习的一个重要分支,近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车,强化学习技术展示了其强大…...
jQuery学习笔记2
jQuery 属性操作 <body><a href"http://www.itcast.cn" title"都挺好">都挺好</a><input type"checkbox" name"" id"" checked /><div index"1" data-index"2">我是div&…...
发现API安全风险,F5随时随地保障应用和API安全
分析数据显示,目前超过90%的基于Web的网络攻击都以API端点为目标,试图利用更新且较少为人所知的漏洞,而这些漏洞通常是由安全团队未主动监控的API所暴露。现代企业需要一种动态防御策略,在风险升级成代价高昂、令人警惕且往往无法…...
移动端如何实现上拉加载
一、理解上拉加载的原理 上拉加载是一种在移动端很常见的交互方式,其原理是当用户在页面上向上滑动(即滚动条接近底部)时,触发一个加载更多数据的操作。这通常涉及到对滚动事件的监听以及判断滚动位置是否达到了触发加载的阈值。…...
the request was rejected because no multipart boundary was found
文章目录 1. 需求描述2. 报错信息3. 探索过程 1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票,经过后端解析PDF之后,将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.u…...
Android 自定义shell命令
模拟触摸、按键等操作,直接在命令行输入对应命令即可。命令行如何识别并操作此命令,执行操作的是shell程序,还是java程序?是不是可以添加自定义的命令? 以下在Android13的代码中分析input命令 Android系统中使用了一…...
HTML5滑块(Slider)
HTML5 的滑块(Slider)控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例: <…...
《SwiftUI 实现点击按钮播放 MP3 音频》
功能介绍 点击按钮时,应用会播放名为 yinpin.mp3 的音频文件。使用 AVAudioPlayer 来加载和播放音频。 关键点: 按钮触发:点击按钮会调用 playAudio() 播放音频。音频加载:通过 Bundle.main.url(forResource:) 加载音频文件。播…...
表单元素(标签)有哪些?
HTML 中的表单元素(标签)用于收集用户输入的数据,常见的有以下几种: 文本输入框 <input type"text">:用于单行文本输入,如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…...
大型ERP系统GL(总账管理)模块需求分析
主要介绍了GL系统的需求分析,包括系统概述、功能描述、帐薄管理、报表管理、期末处理、财务报表以及凭证的快速输入方式、可用性设计、保存、自动审核和打印等方面的内容。系统概述部分介绍了系统的功能结构和模块流程图。 功能描述部分详细描述了系统的基础资料和业…...
SQL常用语句(基础)大全
SQL语句的类型 1.DDL 1.库2.表 2.DML 1.插入数据 insert inot2.删除数据 delete / truncate3.修改数据 update set 3.DQL 1.无条件查询2.查询 什么开始 到什么结束3.指定条件查询 1.单个条件 ro in2.多个条件 and4.查询不为NULL值 is not null ,为NULL值 is null5.模糊查询 li…...
关于HarmonyOS Next中卡片的使用方法
关于Harmony OS中卡片的使用方法 在Harmony OS中,静态卡片是一种非常有用的组件,用于提供应用内功能组件的交互和信息展示。本文将详细介绍如何在Harmony OS中使用静态卡片以及相关的API接口。 1. 概述 静态卡片是Harmony OS中的一种交互组件…...
Retrofit和rxjava 实现窜行请求,并行请求,循环多次请求,递归请求,错误重试
在使用 Retrofit 和 RxJava 时,可以通过多种方式实现多次请求,比如串行请求、并行请求、依赖请求等。以下是一些常见的实现方式: 1. 串行请求(依赖关系) 一个请求的结果作为另一个请求的输入,可以用 flat…...
C# OpenCV机器视觉:目标跟踪
在一个阳光明媚的下午,阿强正在实验室里忙碌,突然他的同事小杨走了进来,脸上挂着一丝困惑。 “阿强,我的目标跟踪项目出了问题!我想跟踪一个移动的物体,但总是跟丢!”小杨一边说,一…...
LeetCode 191 位1的个数
计算正整数二进制表示中汉明重量的两种实现方式对比 在编程的世界里,我们常常会遇到一些有趣又实用的小问题,今天就来和大家分享一下如何计算一个正整数二进制表示中设置位(也就是 1 的个数,专业术语叫汉明重量)的问题…...
【软件测试面试】银行项目测试面试题+答案(二)
前言 面试题:贷款有哪几种形式? 贷款是指金融机构或其他信贷机构向借款人提供资金,并按照约定的条件和期限收取一定利息的行为。根据贷款的不同形式,贷款可以分为以下几种: 按照还款方式分:分期付款贷款、到期一次…...
分布式消息队列RocketMQ
一、RocketMQ概述 1.1 MQ 概述 MQ,Message Queue,是一种提供消息队列服务的中间件,也成为消息中间件,是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据 1.2 MQ 用途 MQ的用途总结起来可分为以下三点 限流削峰…...
Temporary failure resolving ‘security.ubuntu.com‘
apt-get update 的时候出现: Temporary failure resolving security.ubuntu.com Temporary failure resolving archive.ubuntu.com具体信息: > ERROR [devel 3/17] RUN bash ./install_base.sh 3.12.3 && rm install_base.sh …...
0基础跟德姆(dom)一起学AI 自然语言处理10-LSTM模型
1 LSTM介绍 LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析: 遗忘门输入门细胞状态输出门…...
设计模式 创建型 建造者模式(Builder Pattern)与 常见技术框架应用 解析
单例模式(Singleton Pattern),又称生成器模式,是一种对象构建模式。它主要用于构建复杂对象,通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建出具有不同表示的对象。该模式的核心思想是将…...
cJson—json和XML比较
cJson—json和XML比较 前言1. 数据结构与表达能力2. 效率(性能)3. 存储占用与传输效率4. 开发难易程度5. 跨平台支持与兼容性6. 灵活性与扩展性7. 错误处理与验证**总结:JSON 与 XML 的优缺点对比选择建议 前言 在嵌入式设备开发中ÿ…...