【C#进阶】C# 反射
序号 | 系列文章 |
---|---|
11 | 【C#基础】C# 预处理器指令 |
12 | 【C#基础】C# 文件与IO |
13 | 【C#进阶】C# 特性 |
文章目录
- 前言
- 1,反射的概念
- 2,使用反射访问特性
- 3,反射的用途
- 4,反射的优缺点比较
- 4.1 优点:
- 4.2 缺点:
- 5,System.Reflection 命名空间
- 5.1 获取程序集中的信息
- 5.2 获取程序集中的类型
- 5.3 获取程序集中的成员
- 5.4 创建类型的实例对象
- 结语
前言
✋ 大家好,我是writer桑,本章为大家介绍 C# 中的反射。
1,反射的概念
反射指的是程序可以访问,检测和修改它本身状态或行为的一种行为。 其中访问的目标包括程序集1、模块和类型对象等。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。反射行为也常常用来访问应用在程序上的特性。
代码示例:(简单展示)
using System;
using System.Reflection;public class Example
{static void Main(){// 使用反射获取程序集的信息:Assembly info = typeof(int).Assembly;Console.WriteLine(info);}
}
运行结果:
在上例中,使用 typeof 方法获取已加载的 int 程序集的完整名称。
2,使用反射访问特性
在前面的一章中,我们讨论到了 C# 使用反射访问特性的操作。在本章中就可以使用反射的操作来访问 Example 类中的元数据。
代码示例:
using System;[System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct)
]
public class AuthorAttribute : System.Attribute
{public string name; public double age;// 构造函数public AuthorAttribute(string name){this.name = name;age = 11;}
}[Author("writer桑", age = 21)]
public class Example
{// Example类成员
}public class Program
{static void Main(){// 访问 Example 类应用的特性 Type type = typeof(Example);// 遍历输出 foreach(Object attributes in type.GetCustomAttributes(true)){AuthorAttribute author = (AuthorAttribute)attributes;Console.WriteLine(author.age);Console.WriteLine(author.name); }}
}
运行结果:
3,反射的用途
反射的用途可以总结为以下几点:
- 需要访问程序中的元数据的特性时。(点击了解更多)
- 检查和实例化程序集中的类型时。
- 在运行时构建新的类型,比如使用 System.Reflection.Emit 中的类。(点击了解更多)
- 执行后期绑定,访问在运行时创建的类型上的方法时。(点击了解更多)
4,反射的优缺点比较
反射的优缺点比较:
4.1 优点:
- 反射是运行期的操作,提高了程序的灵活性和扩展性。
- 降低耦合度2,提高自适应能力。
- 允许动态的创建和使用对象,无需提前硬编码3目标对象。
4.2 缺点:
- 性能较低,反射是运行期4的代码,在性能方面不如直接的编译型5代码。
- 可读性较低,使用反射会使得程序本身的逻辑变得复杂,在可读性方面不如直接的代码来的简洁。
- 维护成本变高,反射是一种绕过了源代码的技术, 因而在维护的方面难度较高。
5,System.Reflection 命名空间
System.Reflection 命名空间中包含通过检测托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。同时也可以用于操作加载类型的实例,例如钩子函数6或调用方法。在 C# 中,实现反射操作常常需要用到 System.Reflection 命名空间中的类和方法。
列举一些 System.Reflection 命名空间中常用的反射操作:
5.1 获取程序集中的信息
System.Reflection 命名空间中的 Assembly.FullName 等属性可以用来获取程序集中的信息。
代码示例:
using System;
using System.Reflection;public class Example
{private int factor;public Example(int f){factor = f;}public int SampleMethod(int x){Console.WriteLine($"实例方法的执行:({x})");return x * factor;}public static void Main(){Assembly assem = typeof(Example).Assembly;Console.WriteLine($"程序集的全程:{assem.FullName}");// 可以使用 AssemblyName 类型解析完整名称。AssemblyName assemName = assem.GetName();Console.WriteLine($"名称: {assemName.Name}");//从程序集创建一个对象,并传入正确的数字//构造函数的参数类型。Object o = assem.CreateInstance("Example", false, BindingFlags.ExactBinding, null, new Object[] { 2 }, null, null);// 对对象的实例方法进行晚绑定调用。MethodInfo m = assem.GetType("Example").GetMethod("SampleMethod");Object ret = m.Invoke(o, new Object[] { 42 });Console.WriteLine($"示例方法的返回值为:{ret}");Console.WriteLine($"程序集入口点:{assem.EntryPoint}");}
}
运行结果:
5.2 获取程序集中的类型
System.Reflection 命名空间中的 Assembly.GetExportedTypes 方法可以用来获取程序集中定义的公共类型,这些公共类型在程序集外可见。
代码示例:
using System;
using System.Reflection;public class PublicClass
{public class PublicNestedClass { }protected class ProtectedNestedClass { }internal class FriendNestedClass { }private class PrivateNestedClass { }
}public class Example
{public static void Main(){// 获取程序集中定义的公共类型 foreach (Type t in typeof(Example).Assembly.GetExportedTypes()){Console.WriteLine(t);}}
}
运行结果:
5.3 获取程序集中的成员
System.Reflection 命名空间中的 MemberInfo 类中的属性和方法可以用来获取有关成员属性的信息并提供对成员元数据的访问权限。
代码示例:
using System;
using System.Reflection;public class Example
{// 显示应用到指定成员的自定义属性 public static void DisplayAttributes(Int32 indent, MemberInfo mi){// 获取自定义属性集;如果不存在,则返回。object[] attrs = mi.GetCustomAttributes(false);if (attrs.Length == 0) { return; }// 显示应用于该成员的自定义属性。Display(indent + 1, "属性:");foreach (object o in attrs){Display(indent + 2, "{0}", o.ToString());}}// 显示一个缩进的格式化字符串。 public static void Display(Int32 indent, string format, params object[] param){Console.Write(new string(' ', indent * 2));Console.WriteLine(format, param);}public static void Main(){//该变量保存缩进的数量, 显示每一行信息时使用。Int32 indent = 0;// 显示加载到这个 AppDomain 第一个 程序集的信息。Assembly b = AppDomain.CurrentDomain.GetAssemblies()[0];Display(indent, "程序集: {0}", b);// 显示从此程序集导出的 第一个 类型的相关信息。 indent += 1;Type t = b.GetExportedTypes()[0];Display(0, "");Display(indent, "类型: {0}", t);// 遍历显示成员及其自定义属性。indent += 1;foreach (MemberInfo mi in t.GetMembers()) // GetMembers 方法{Display(indent, "成员: {0}", mi.Name);DisplayAttributes(indent, mi);// 如果成员是一个方法,显示它的参数信息。if (mi.MemberType == MemberTypes.Method){foreach (ParameterInfo pi in ((MethodInfo)mi).GetParameters()){Display(indent + 1, "参数: 类型={0}, 名字={1}", pi.ParameterType, pi.Name);}}// 如果成员是一个属性,显示关于属性的访问方法的信息。 if (mi.MemberType == MemberTypes.Property){foreach (MethodInfo am in ((PropertyInfo)mi).GetAccessors()){Display(indent + 1, "访问器方法: {0}", am);}}}}
}
运行结果:
5.4 创建类型的实例对象
System.Reflection 空间中的 Assembly.CreateInstance 方法可以用来获取包含当前执行的代码的程序集,以此来创建类型的实例对象。
代码示例:
using System;
using System.Reflection;public class Person
{private string _name;public Person(){ }public Person(string name){this._name = name;}public string Name{get { return this._name; }set { this._name = value; }}public override string ToString(){return this._name;}
}public class Example
{public static void Main(){Assembly assem = typeof(Person).Assembly;// 创建 Person 类的实例化对象 Person p = (Person)assem.CreateInstance("Person");if (!(p == null)){p.Name = "John";Console.WriteLine($"实例化值为'{p}'的{p.GetType().Name}对象");}else{Console.WriteLine("无法实例化Person对象。");}}
}
运行结果:
点击了解更多 System.Reflection 命名空间的使用。
结语
👋 以上就是关于 C# 反射的介绍啦,希望对大家有所帮助。感谢大家的支持。
程序集(assembly):是一个及一个以上托管模块,以及一些资源文件的逻辑组合。在 .NET 中,dll与exe文件都是程序集。 ↩︎
耦合性(或称耦合力或耦合度):是一种软件度量,是指一程序中,模块及模块之间信息或参数依赖的程度。 ↩︎
硬编码:是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践,与从外部获取数据或在运行时生成数据不同。 ↩︎
运行期:是把编译后的文件交给计算机执行,直到程序运行结束。 ↩︎
编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程。 ↩︎
钩子函数:是 Windows 消息处理机制的一部分,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。 ↩︎
相关文章:
【C#进阶】C# 反射
序号系列文章11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO13【C#进阶】C# 特性文章目录前言1,反射的概念2,使用反射访问特性3,反射的用途4,反射的优缺点比较4.1 优点:4.2 缺点:5,System…...
公网NAT网关与VPC NAT网关介绍与实践
NAT网关介绍 NAT网关是一种网络地址转换服务,提供NAT代理(SNAT和DNAT)能力。 公有云NAT分为公网NAT网关和VPC NAT网关。 1)公网NAT网关:提供公网地址转换服务。 2)VPC NAT网关:提供私网地址转换…...
Windows中UWP、WPF和Windows窗体的区别
Windows 中开发应用(或者可以说客户端)有三种方法: UWP(Universal Windows Platform)、WPF(Windows Presentation Foundation)和 Windows 窗体(Win Forms)。这三种方法在…...
Flink从入门到精通系列(一)
1、Flink概述 Apache Flink 是一个框架和分布式处理引擎,用于在, 无边界和有边界数据流上进行有状态的计算 ,Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 Apache Flink 功能强大,支持开发…...
云原生应用风险介绍
本博客地址:https://security.blog.csdn.net/article/details/129303616 一、传统风险 传统风险主要是注入、敏感数据泄露、跨站脚本、配置错误等等,这些传统的安全风险在云原生应用中也是存在的,这里就不具体展开说了。 二、云原生应用架…...
什么是测试用例设计?
前言 想要进行测试自动化的团队都会遇到这个问题:自动化的成功和编码能力有多大的关联?现在更多的招聘信息越来越偏重于对测试人员的编程能力的要求,似乎这个问题的答案是极大的正关联性。 测试人员可以将编码能力用于与测试相关的各种目的…...
数据分析:基于K-近邻(KNN)对Pima人糖尿病预测分析
数据分析:基于K-近邻(KNN)对Pima人糖尿病预测分析 作者:AOAIYI 作者简介:Python领域新星作者、多项比赛获奖者:AOAIYI首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞&#x…...
Kettle体系结构及源码解析
介绍 ETL是数据抽取(Extract)、转换(Transform)、装载(Load)的过程。Kettle是一款国外开源的ETL工具,有两种脚本文件transformation和job,transformation完成针对数据的基础转换&…...
大数据 | (二)SSH连接报错Permission denied
大数据 | (三)centos7图形界面无法执行yum命令:centos7图形界面无法执行yum命令 哈喽!各位CSDN的朋友们大家好! 今天在执行Hadoop伪分布式安装时,遇到了一个问题,在此跟大家分享, …...
前端——6.文本格式化标签和<div>和<span>标签
这篇文章,我们来讲一下HTML中的文本格式化标签 目录 1.文本格式化标签 1.1介绍 1.2代码演示 1.3小拓展 2.div和span标签 2.1介绍 2.2代码演示 2.3解释 3.小结 1.文本格式化标签 在网页中,有时需要为文字设置粗体、斜体和下划线等效果…...
浅谈Xpath注入漏洞
目录 知识简介 攻击简介 基础语法 语法演示 漏洞简介 漏洞原理 漏洞复现 Xpath盲注 知识简介 攻击简介 XPath注入攻击是指利用XPath 解析器的松散输入和容错特性,能够在 URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权…...
Oracle LogMiner分析归档日志
目录:Oracle LogMiner分析归档日志一、准备测试环境1、开启数据库归档日志2、打开数据库最小附加日志3、设置当前session时间日期格式二、创建测试数据1、创建数据2、数据落盘三、日志发掘测试挖掘在上次归档的Redo Log File1.确定最近归档的Redo Log File2.指定要分…...
趣味三角——第15章——傅里叶定理
第15章 傅里叶定理(Fourier’s Theorem) Fourier, not being noble, could not enter the artillery, although he was a second Newton. (傅立叶出生并不高贵,因此按当时的惯例进不了炮兵部队,虽然他是第二个牛顿。) —Franois Jean Dominique Arag…...
市场营销的核心是什么?
之所以写下「市场营销的核心是什么?」这篇文章,是因为这几天刚读完了《经理人参阅:市场营销》这本书。作为一个有着近十年工作经验的市场营销从业人员,看完这本书也产生了很多新的想法,也想记录一下,遂成此…...
c/cpp - 多线程/进程 多进程
c/cpp - 多线程/进程 多进程多进程创建多进程进程等待多进程 宏观上 两个进程完全并发的 父子进程具有互相独立的进程空间 父进程结束,不影响子进程的执行 创建多进程 #include <sys/types.h> #include <unistd.h> #include <stdio.h>int main()…...
MySQL必知必会 | 存储过程、游标、触发器
使用存储过程 存储过程 简单来说就是为了以后的使用而保存的一条或多条MySQL语句的集合。 我觉得就是封装了一组sql语句 为什么需要存储过程(简单来说就是,简单、安全、高性能 通过把处理封装在容易使用的单元中,简化复杂操作所有开发人员…...
优化Facebook广告ROI的数据驱动方法:从投放到运营
“投放广告并不是最终的目的,关键在于如何最大程度地利用数据驱动的方法来提高广告投放的回报率(ROI)”Facebook广告是现代数字营销中最为常见和重要的广告形式之一。但是,要让Facebook广告真正发挥作用,需要通过数据驱…...
动态规划入门经典问题讲解
最近开始接触动态规划问题,以下浅谈(或回顾)一下这些问题的求解过程。解题思路对于动态规划问题,由于最终问题的求解需要以同类子问题作为基础,故需要定义一个dp数组(一维或二维)来记录问题求解…...
快速入门深度学习1(用时1h)
速通《动手学深度学习》1写在最前面0.内容与结构1.深度学习简介1.1 问题引入1.2 思路:逆向思考1.3 跳过1.4 特点1.5 小结2.预备知识(MXNet版本,学错了。。。。)2.1 获取和运行本书的代码2.2 数据操作2.2.1 略过2.2.2 小结2.3 自动…...
PaddleOCR关键信息抽取(KIE)的训练(SER训练和RE训练)错误汇总
1.SER训练报错: SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception 1.1.问题描述 在执行训练任务的时候报错 单卡训练 python3 tools/train.py -c train_data/my_data/ser_vi_layoutxlm_xfund_zh.yml错误信息如下: T…...
信息收集之搜索引擎
Google Hacking 也可以用百度,不过谷歌的搜索引擎更强大 site 功能:搜索指定域名的网页内容,可以用来搜索子域名、跟此域名相关的内容 示例: site:zhihu.com 搜索跟zhihu.com相关的网页“web安全” site:zhihu.com 搜索zhihu…...
Flutter(四)布局类组件
目录布局类组件简介布局原理与约束线性布局(Row和Column)弹性布局流式布局(Wrap、Flow)层叠布局(Stack、Positioned)对齐与相对定位(Align)Align和Stack对比Center组件LayoutBuilder…...
【黑马】Java基础从入门到起飞目录合集
视频链接: Java入门到起飞(上部):BV17F411T7AoJava入门到起飞(下部):BV1yW4y1Y7Ms 学习时间: 2023/02/01 —— 2023/03/09断断续续的学习,历时大概37天,完结撒…...
PMP考前冲刺3.10 | 2023新征程,一举拿证
题目1-2:1.在最近的一次耗时四周的迭代中,赫克托尔所在的敏捷团队刚完成了10 个用户故事点的开发、测试和发布,那么团队的速度是?A. 10B. 4C. 5D.402.产品负责人奥佩,倾向于在短周期内看到工作产品的新版本,…...
JavaScript Math常用方法
math是JavaScript的一个内置对象,它提供了一些数学属性和方法,可以对数字进行计算(用于Number类型)。 math和其他全局对象不同,它不是一个构造器,math的所有方法和属性都是静态的,直接使用并传入…...
【C++】模板进阶
文章目录一、非类型模板参数1、非类型模板参数2、C11 中的 array 类二、模板的特化1、模板特化的概念2、函数模板特化3、类模板特化3.1 全特化3.2 偏特化三、模板的分离编译四、模板总结一、非类型模板参数 1、非类型模板参数 模板参数分为类型形参与非类型形参,类…...
三板斧解决leetcode的链表题
在《波奇学单链表》中我们提到单链表的两个特点单向性。头节点尾节点的特殊性导致分类讨论的情况。如何看单链表?让我们简化成下图cur表示当前节点,下图表示cur移动,圆圈表示值用哨兵卫节点(新的头节点)和把尾节点看成NULL来把头尾节点一般化…...
全生命周期的云原生安全框架
本博客地址:https://security.blog.csdn.net/article/details/129423036 一、全生命周期的云原生安全框架 如图所示: 二、框架说明 在上图中,我们从两个维度描述各个安全机制,横轴是开发和运营阶段,细分为编码、测试…...
【本地网站上线】ubuntu搭建web站点,并内网穿透发布公网访问
【本地网站上线】ubuntu搭建web站点,并内网穿透发布公网访问前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子…...
电脑怎么重装系统?教你轻松掌握这些方法
重新安装计算机系统有两种原因:一种是计算机系统可以正常使用,但是电脑比较卡,为了提高它的运行速度,所以想要通过重新安装系统来解决这个问题;另一种原因是计算机系统文件丢失,系统出现蓝屏,或者黑屏的情况…...
leetcode-每日一题-2379(简单,字符串)
久违的简单题......给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 W 要么是 B ,表示第 i 块的颜色。字符 W 和 B 分别表示白色和黑色。给你一个整数 k ,表示想要 连续 黑色块的数目。每一次操作中,你可以选择…...
SLF4J日志框架在项目中使用
介绍 SLF4J全称“Simple Logging Facade for Java”,作为各种日志框架的简单门面。例如: java.util.logging、logback 、 reload4j等。只需要切换日志框架的jar包依赖就可以切换日志框架。 SLF4J支持的日志框架包含如下: log4j:…...
Spark MLlib 模型训练
Spark MLlib 模型训练决策树随机森林GBDTSpark MLlib 开发框架下 : 监督学习 : 回归 (Regression) , 分类 (Classification) , 协同过滤 (Collaborative Filtering)非监督学习 : 聚类 (Clustering) 、频繁项集 (Frequency Patterns) 例子分类 : 算法分类 : 算法分类算法子分类…...
Python中变量的作用域精讲
文章目录前言一、局部变量二、全局变量前言 变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的 “有效范围” 将变量分为 “全局变量” 和 “局部变量”。 一、局部变量 局部变…...
数据仓库工程师的工作职责的相关介绍
1. BI 开发工程师的工作内容是什么? BI开发工程师(Business Intelligence Developer)是负责设计和开发企业级BI系统的专业人员。他们的主要工作是从多个数据源中提取、转换、加载和分析数据,以支持企业决策。以下是BI开发工程师的…...
ESP UART 介绍
1 UART 介绍 UART 是一种以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。 1.1 UART 通信协议 一个典型的 UART 帧开始…...
第十三届蓝桥杯省赛Python大学B组复盘
目录 一、试题B:寻找整数 1、题目描述 2、我的想法 3、官方题解 4、另解 二、试题E:蜂巢 1、题目描述 2、我的想法 3、官方题解 三、试题F:消除游戏 1、题目描述 2、我的想法(AC掉58.3%,剩下全超时&#x…...
linux入门---vim的配置
这里写目录标题预备知识如何配置vimvim一键配置预备知识 在配置vim之前大家首先得知道一件事就是vim的配置是一人一份的,每个用户配置的vim都是自己的vim,不会影响到其他人,比如说用户xbb配置的vim是不会影响到用户wj的,虽然不同…...
Python简写操作(for、if简写、匿名函数)
Python简写操作(for、if简写、匿名函数)1. for 简写1.1 一层 for 循环1.2 两层 for 循环2. if 简写3. for 与 if 的结合简写4. 匿名函数 lambda1. for 简写 举个例子: y [1, 2, 3, 4, 5, 6] result [(i * 2) for i in y] print(result)# …...
毕业设计常用模块之温湿度模块DHT11模块使用
DHT11是一款可以测量温度数据和湿度数据的传感器 产品特点 暖通空调、除湿器、农业、冷链仓储、测试及检测设备、消费品、汽车、自动控制、数据记录器、气 象站、家电、湿度调节器、医疗、其他相关湿度检测控制 外形尺寸 第3管脚:NC 是没有用的 典型电路 通信方式…...
Cadence Allegro 导出Design Rules Net Shorts Check(DRC)Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Design Rules Net Shorts Check(DRC)Report作用3,Design Rules Net Shorts Check(DRC)Report示例4,Design Rules Net Shorts Check(DRC)Report导出方法4.1,方法14.2,方法2...
第 46 届世界技能大赛浙江省选拔赛“网络安全“项目C模块任务书
第46届世界技能大赛浙江省选拔赛"网络安全"项目C模块(夺旗行动(CTF)挑战)第46届世界技能大赛浙江省选拔赛"网络安全"项目C模块第一部分 WEB第二部分 CRYPTO第三部分 REVERSE第四部分 MISC第五部分 PWN第46届世…...
C++:详解C++11 线程(一):MingGW 各版本区别及安装说明
MingGW 各版本区别一:MinGW、MinGW-w64 简介二:MinGW 各版本参数说明三:下载解压一:MinGW、MinGW-w64 简介 MinGW(全称为 Minimalist GNU for Windows),它实际上是将经典的开源 C 语言编译器 G…...
第十二章 ArrayList和 LinkedList的区别
ArrayList:基于动态数组(自动扩容),连续内存存储,由于底层是数组,适合使用下标进行访问,但扩容一直都是数组的缺点,所以使用尾插法进行扩容可以有效提高扩容效率。还有就是创建Array…...
案例06-复用思想的接口和SQL
目录 一:背景介绍 二:思路&方案 三:过程 1.Controller层接口的复用 2.Mapper层sql语句的复用 四:总结 一:背景介绍 我们在开发项目的过程中非常容易出现的一种现象就是用什么我就直接写什么,就像我…...
【Java学习笔记】17.Java 日期时间(2)
前言 本章继续介绍Java的日期时间。 Calendar类 我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案…...
【学习Docker(八)】Docker Canal的安装与卸载
座右铭:《坚持有效输出,创造价值无限》 最近想了解下canal,自行搭建并完成数据同步。经过了几天的踩坑之旅,今天终于搭建成功了。 环境:canalv1.1.5、MySQL8.0、JDK1.8 安装MySQL 创建存放目录 mkdir /docker-localm…...
python的django框架从入门到熟练【保姆式教学】第三篇
在前两篇博客中,我们介绍了Django框架的模型层和数据库迁移功能。本篇博客将重点介绍Django的视图层(View),并讲解如何创建视图函数和URL路由。 视图层(View) Django的视图层是Django应用程序的另一个核心…...
Open3D(C++) Ransac拟合球体(详细过程版)
目录 一、算法原理1、计算流程2、参考文献二、代码实现三、结果展示一、算法原理 1、计算流程 空间球方程: ( x − a ) 2 + ( y − b...
Antlr Tool与antlr runtime的版本一致性问题
1. 意外的问题 在学习Antlr4的visitor模式时,使用IDEA的Antlr插件完成了Hello.g4文件的编译,指定的package为com.sunrise.hello 使用visitor模式遍历语法解析树,遍历过程中打印hello语句 public class HelloVisitorImpl extends HelloBaseVi…...