CH03_反射
第3章:反射
本章目标
-
掌握反射的原理
-
熟悉反射的基本运用
本章内容
反射是什么
C# 编译运行过程
-
首先我们在VS点击编译的时候,就会将C#源代码编译成程序集
-
程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现
-
-
程序集中包含有Microsoft 中间语言 (MSIL) 和必需的元数据。
-
元数据存储以下信息:
- 程序集的说明:标识(名称、版本、区域性、公钥)、导出的类型、该程序集所依赖的其他程序集、运行所需的安全权限。
- 类型的说明:名称、可见性、基类和实现的接口、成员(方法、字段、属性、事件、嵌套的类型)。
- 特性:修饰类型和成员的其他说明性元素。
-
-
在执行时,实时 (JIT) 编译器将 MSIL 转换为本机代码
-
运行 Microsoft 中间语言 (MSIL) 前,必须根据公共语言运行时将其编译为目标计算机基础结构的本机代码。
-
-
运行代码
-
公共语言运行时提供启用要发生的托管执行的基础结构以及执行期间可使用的服务
-
反射的工作原理
反射 来自 System.Reflection命名空间,它可以读取程序集中的元数据,利用元数据创建对象,从而实现各种功能。
提示:
区分 反射 与反编译,反射读取的是元数据,反编译读取的IL代码
反射的优缺点
- 优点:提高了程序的灵活性和扩展性,降低耦合度
- 缺点:由于反射多了一道程序,性能上相较于直接代码要慢
反射的使用
反射相关的类和命名空间
反射的命名空间:
using System.Reflection;
反射相关的类:
System.Type //类型
System.AppDomain //应用程序域
System.Activator //激活器
System.Reflection.Assembly //程序集
System.Reflection.Module //模块System.Reflection.ConstructorInfo //构造函数
System.Reflection.ParameterInfo //方法参数
System.Reflection.MethodInfo //方法
System.Reflection.PropertyInfo //属性
System.Reflection.FieldInfo //字段
System.Reflection.MemberInfo //成员
Type类的应用
Type类中的基本属性

/// <summary>
/// 学生类
/// </summary>
class Student
{private int _num = 0;public string Phone = "15818704257";public string Name { get; set; }public string Address { get; set; }public Student(){//Console.WriteLine("Student 默认构造函数");}public Student(string name){//Console.WriteLine($"Student 参数化构造函数:{name}");}public Student(string name,string phone,string address){}public int PublicMethod(){return int.MinValue;}internal void InternalMethod(){}private void PrivateMethod(){}public void Show(int id){Console.WriteLine("调用了Show()方法!"+id);}
}class MyArray<T>
{}/// <summary>
/// USB接口
/// </summary>
interface IUsb
{}struct Teacher
{}
/// <summary>
/// Type类的基本属性
/// </summary>
static void Fun1()
{Type t0 = typeof(MyArray<int>);Type t1= typeof(Student);Type t2 = typeof(IUsb);Type t3 = typeof(Teacher);Type t4 = typeof(string);Console.WriteLine("名称:"+t1.Name);Console.WriteLine("全名:"+t1.FullName);Console.WriteLine("命名空间:"+t1.Namespace);Console.WriteLine("是否是抽象的:"+t1.IsAbstract);Console.WriteLine("是否是公共的:" + t1.IsPublic);Console.WriteLine("是否是类:" + t1.IsClass);Console.WriteLine("是否是枚举:" + t1.IsEnum);Console.WriteLine("是否是接口:" + t1.IsInterface);Console.WriteLine("是否是嵌套定义的:" + t1.IsNested);Console.WriteLine("是否是值类型:" + t1.IsValueType);Console.WriteLine("是否是泛型类型:" + t1.IsGenericType);
}
using ClassLibrary1;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace CH03Demo
{internal class Program{static void Main(string[] args){Fun11();Console.ReadLine();}}
}
提示:
FullName :获取该类型的完全限定名称,包括其命名空间,但不包括程序集 。
Type类的Assembly属性

/// <summary>
/// Type类的Assembly属性
/// </summary>
static void Fun2()
{Type type = typeof(Student);//程序集Assembly a1 = type.Assembly;Console.WriteLine("位置:" + a1.CodeBase);Console.WriteLine("全名:" + a1.FullName);Console.WriteLine("--------------------------------");Type t1 = typeof(Student);Type t2 = typeof(string);Console.WriteLine("全名:" + t1.FullName);Console.WriteLine("全名:" + t2.FullName);//查看程序集限定名Console.WriteLine(t1.AssemblyQualifiedName);Console.WriteLine(t2.AssemblyQualifiedName);}
Type类对象获取构造函数

/// <summary>
/// 查看构造函数
/// </summary>
static void Fun3()
{Type t= typeof(Student);ConstructorInfo[] ciArray= t.GetConstructors();//遍历构造函数foreach (ConstructorInfo ci in ciArray){Console.WriteLine("构造函数名:" + ci.Name);foreach (ParameterInfo item in ci.GetParameters()){Console.WriteLine("参数:{0},类型:{1}", item.Name, item.ParameterType);}Console.WriteLine("-------------------------------");}
}
Type类对象获取方法

/// <summary>
/// 查看当前实例的所有public方法
/// </summary>
static void Fun4()
{Type t = typeof(Student);MethodInfo[] miArray = t.GetMethods();//遍历构造函数foreach (MethodInfo mi in miArray){Console.WriteLine("方法名:{0},返回类型:{1}",mi.Name,mi.ReturnType);foreach (ParameterInfo item in mi.GetParameters()){Console.WriteLine("参数:{0},类型:{1}" ,item.Name,item.ParameterType);}Console.WriteLine("-------------------------------");}
}
Type类对象获取属性

/// <summary>
/// 查看当前实例的所有public属性
/// </summary>
static void Fun5()
{Type t = typeof(Student);PropertyInfo[] miArray = t.GetProperties();//遍历foreach (PropertyInfo pi in miArray){Console.WriteLine("属性名:{0},类型:{1}",pi.Name,pi.PropertyType);Console.WriteLine("-------------------------------");}
}
Type类对象获取字段

/// <summary>
/// 查看当前实例的所有public字段
/// </summary>
static void Fun6()
{Type t = typeof(Student);FieldInfo[] fiArray = t.GetFields();//遍历foreach (FieldInfo fi in fiArray){Console.WriteLine("字段名:{0},类型:{1}", fi.Name, fi.FieldType);Console.WriteLine("-------------------------------");}
}
Type类对象获取成员

/// <summary>
/// 查看当前实例的所有public成员
/// </summary>
static void Fun7()
{Type t = Type.GetType("CH03Demo.Student"); //typeof(Student);MemberInfo[] miArray = t.GetMembers();//遍历foreach (MemberInfo mi in miArray){Console.WriteLine("成员名:{0},类型:{1}", mi.Name, mi.MemberType);Console.WriteLine("-------------------------------");}
}
使用BindingFlags筛选成员

/// <summary>
/// 使用绑定标志枚举筛选成员
/// </summary>
static void Fun8()
{Type t = Type.GetType("CH03Demo.Student"); //typeof(Student);//GetMembers 中传入 BindingFlags 相当于是对成员信息进行一个过滤//BindingFlags 不仅仅是GetMembers 专有,很多方法中都可以传入BindingFlags进行过滤//BindingFlags 是位标志枚举,可使用 | & ^ 等运算符, | 表示取并集,& 表示取交集,^ 表示取差集//BindingFlags.Public 表示公共成员//BindingFlags.NonPublic 表示非公共成员//BindingFlags.Instance 表示实例成员//BindingFlags.Static 表示静态成员MemberInfo[] miArray = t.GetMembers(BindingFlags.NonPublic | BindingFlags.Instance);//遍历foreach (MemberInfo mi in miArray){Console.WriteLine("成员名:{0},类型:{1}", mi.Name, mi.MemberType);Console.WriteLine("-------------------------------");}
}
提示:
BindingFlags.Instance 和BindingFlags.Static :实例成员是相对于静态成员而言的,多数情况下我们都省略了BindingFlags 这个参数,少数需要筛选成员的时候,传入该参数
获取Type实例的方式
/// <summary>
/// 获取Type实例的方式
/// </summary>
static void Fun9()
{Student stu = new Student();//方式1:System.Type类的ComDefaultInterface特性Type t1 = typeof(Student);//方式2:System.Object中的GetType()方法Type t2 = stu.GetType();//方式3:System.Type中GetType()方法//想通程序集,传入FullName即可(命名空间+类名)Type t3 = Type.GetType("CH03Demo.Student");//不同程序集,则还需传入程序集名Type t4 = Type.GetType("ClassLibrary1.Class1,ClassLibrary1");}
Activator类的应用
//Activator类主要用于创建对象的实例
Type type = typeof(UserInfo);
UserInfo userInfo=(UserInfo)Activator.CreateInstance(type);
Assembly类的应用
- 对于程序集的限定名称使用小结
- 程序集的显示名称,可通过
Assembly.FullName和Assembly.GetName().FullName(即AssemblyName.FullName)两种方式获取,这种获取的名称,一般是作为Assembly.Load()的标准参数值 - 类型的程序集限定名,可通过Type类中的
AssemblyQualifiedName属性获取(通常作为Type.GetType()方法中的参数值), 相较于Assembly.FullName,名称格式上多了 Type.FullName 这一部分
- 程序集的显示名称,可通过
- Assembly类中的常用方法
- Assembly.Load()方法接收一个String或AssemblyName类型作为参数,这个参数需要程序集的强名称
- Assembly.LoadFrom() 根据程序集的文件名或路径,加载程序集;这个方法会加载此程序集引用的其他程序集
- Assembly.LoadFile() 加载指定路径上的程序集文件内容,和上面方法的不同之处是这个方法不会加载此程序集引用的其他程序集
程序集的强名称:是程序集的FullName(具有名称,版本,语言,公钥标记);
程序集的弱命名:只有程序集名称而没有版本,语言和公钥标记;平常我们创建的一个类库,如果没有特殊操作都属于是是弱名称程序集
Load(“强名称程序集”)查找程序集的顺序:首先它会去全局程序集缓存查找,然后到应用程序的根目录查找,最后会到应用程序的私有路径查找。
Load(“弱名称程序集”)查找程序集的顺序:首先到应用程序的根目录查找,最后会到应用程序的私有路径查找。
/// <summary>/// 程序集加载的3种方式/// </summary>static void Fun12(){//方式1:将ClassLibrary1.dll放在根目录下,传入程序集的简单名称,即可加载Assembly assembly1 = Assembly.Load("ClassLibrary1");//方式2:传入ClassLibrary1.dll的文件路径,会加载ClassLibrary1.dll依赖的程序集Assembly assembly2 = Assembly.LoadFrom("ClassLibrary1.dll");//方式3:传入ClassLibrary1.dll的文件路径,不会加载ClassLibrary1.dll依赖的程序集Assembly assembly3 = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory+ "ClassLibrary1.dll");}
Module类的应用
什么是模块
System.Reflection.Module类是C#中的一个重要类,它提供了有关程序集中模块的信息和功能。这个类的作用和使用方法在深入探讨模块类时会被详细讨论,通过一些示例代码来展示它的功能。在C#中,模块可以是一个源代码文件、一个编译后的文件(DLL或EXE)或者一个动态生成的程序集。每个模块都有自己的元数据和IL代码,而System.Reflection.Module类提供了访问和操作这些模块的能力。通过Module类,我们可以获取模块的元数据、类型信息、成员信息以及执行模块中的代码。
模块的属性

/// <summary>
/// 模块
/// </summary>
static void Fun13()
{//类型对象Type t1 = typeof(Student);Type t2 = typeof(string);//模块Module module1 = t1.Module;Module module2 = t2.Module;//基本属性Console.WriteLine("模块名:"+module1.Name);Console.WriteLine("完全限定名:" + module1.FullyQualifiedName);Console.WriteLine("程序集名:" + module1.Assembly.FullName);Console.WriteLine("-----------------------------");Console.WriteLine("模块名:" + module2.Name);Console.WriteLine("完全限定名:" + module2.FullyQualifiedName);Console.WriteLine("程序集名:" + module2.Assembly.FullName);
}
AppDomain类的应用
前提:
从.NET Core开始,不再支持运行时创建其他AppDomain(即仅可在.NET Framework下支持创建其他AppDomain)。
因此以下部分内容仅在.NET Framework上有效。
官方说明:.NET Framework 技术在 .NET 6 及更高版本上不可用
AppDomain应用程序域:一组程序集的逻辑容器,CLR创建的第一个AppDomain称为默认AppDomain,仅在进程终止时销毁。
一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.

/// <summary>
/// 应用程序域
/// </summary>
static void Fun14()
{//获取当前应用程序域中的所有程序集Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();foreach (Assembly assembly in assemblies){Console.WriteLine(assembly.FullName);}
}
通过反射创建对象
/// <summary>
/// 反射:创建对象的3种方式
/// </summary>
static void Fun10()
{//类型对象Type t = typeof(Class1);#region 方式1:通过Invoke 执行构造函数//获取构造函数对象ConstructorInfo ci1 = t.GetConstructor(new Type[] { });ConstructorInfo ci2 = t.GetConstructor(new Type[] {typeof(int) });//调用构造函数创建实例object obj1= ci1.Invoke(new object[] { });object obj2 = ci2.Invoke(new object[] {15 });//类型装换Class1 c1=obj1 as Class1;Class1 c2 = obj2 as Class1;#endregion#region 方式2:通过Assembly 创建实例//程序集对象Assembly assembly = Assembly.Load("ClassLibrary1");//创建实例object obj3 = assembly.CreateInstance("ClassLibrary1.Class1",true);//类型转换Class1 c3= obj3 as Class1;#endregion#region 方式3:通过 Activator 创建实例//创建对象object obj4 = Activator.CreateInstance(t);object obj5 = Activator.CreateInstance("ClassLibrary1", "ClassLibrary1.Class1");//类型转换Class1 c4 = obj4 as Class1;Class1 c5 = obj5 as Class1;#endregion
}
通过反射获取对象成员

/// <summary>
/// 反射:获取 方法、属性、字段
/// </summary>
static void Fun11()
{//类型对象Type t = typeof(Student);//目标实体object obj= Activator.CreateInstance(t);#region 反射:获取方法//获取方法对象MethodInfo mi= t.GetMethod("Show");//执行方法mi.Invoke(obj, new object[] {25 });//Invoke 调用静态方法,对象可以为null ,形如 //methodInfo.Invoke(null, new object[] { "hello" })#endregion#region 反射:获取属性//获取属性对象PropertyInfo pi = t.GetProperty("Name");pi.SetValue(obj, "张三");//调用属性string name= pi.GetValue(obj) as string;Console.WriteLine("姓名:"+name);#endregion#region 反射:获取字段//获取属性对象FieldInfo fi = t.GetField("Phone");fi.SetValue(obj, "13523983345");//调用字段string phone = fi.GetValue(obj) as string;Console.WriteLine("电话:" + phone);#endregion
}
反射的应用
数据库辅助类反射
常规情况下:编写固定DBHelper类
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CH03Demo
{internal class DBHelper{private static readonly string _connectionString = "server=.;database=test;uid=sa;pwd=sa";/// <summary>/// 执行增删改/// </summary>/// <param name="sql"></param>/// <returns></returns>public int ExecuteNonQuery(string sql,params SqlParameter[] parameters){//略return 0;}/// <summary>/// 执行查询/// </summary>/// <param name="sql"></param>/// <returns></returns>public DataTable ExecuteTable(string sql,params SqlParameter[] parameters){//略return null;}}
}
反射+配置文件动态实现
1.创建一个接口
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Common;namespace CH03Demo
{/// <summary>/// 数据访问接口/// </summary>internal interface IDBHelper{/// <summary>/// 执行增删改/// </summary>/// <param name="sql"></param>/// <returns></returns>int ExecuteNonQuery(string sql, params DbParameter[] parameters);/// <summary>/// 执行查询/// </summary>/// <param name="sql"></param>/// <returns></returns>DataTable ExecuteTable(string sql, params DbParameter[] parameters);}
}
2.实现接口
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CH03Demo
{/// <summary>/// sqlserver 数据库的数据访问类/// </summary>internal class SqlServerDBHelper : IDBHelper{public int ExecuteNonQuery(string sql, params DbParameter[] parameters){//代码略return 0 ;}public DataTable ExecuteTable(string sql, params DbParameter[] parameters){//代码略return null;}}
}
3.增加配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /></startup><appSettings><add key="DBType" value="SqlServer"/></appSettings>
</configuration>
4.过反射+配置文件 调用 数据库执行语句的方法
/// <summary>
/// 通过反射创建数据辅助类对象
/// </summary>
static void Fun15()
{string fullName = ConfigurationManager.AppSettings["DBType"].ToString();IDBHelper dbHelper = (IDBHelper)Assembly.Load("DBHelper").CreateInstance(fullName);var data1 = dbHelper.ExecuteNonQuery("delete from student where studentNo=@studentNo", new SqlParameter("@studentNo", "GCKJ101"));var data2 = dbHelper.ExecuteTable("select * from student");Console.WriteLine(data1);Console.WriteLine(data2.Rows.Count);
}
目录结构:

本章总结
略
课后作业
1.通过反射查看int类 Type基本信息
2.通过反射调用int类的实例方法: CompareTo
3.通过反射调用int类的静态方法: Parse
相关文章:
CH03_反射
第3章:反射 本章目标 掌握反射的原理 熟悉反射的基本运用 本章内容 反射是什么 C# 编译运行过程 首先我们在VS点击编译的时候,就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft …...
vue2侧边导航栏路由
<template><div><!-- :default-active"$route.path" 和index对应其路径 --><el-menu:default-active"active"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-col…...
core 不可变类型 线程安全 record
当一个类型的对象在创建时被指定状态后,就不会再变化的对象,我们称之为不可变类型。这种类型是线程安全的,不需要进行线程同步,非常适合并行计算的数据共享。它减少了更新对象会引起各种bug的风险,更为安全。 System.D…...
linux之调度管理(8)-SMP cpu 的 psci启动
一、psci介绍 psci是arm提供的一套电源管理接口,当前一共包含0.1、0.2和1.0三个版本。它可被用于以下场景: (1)cpu的idle管理 (2)cpu hotplug以及secondary cpu启动 (3)系统shutdo…...
review-消息中间件MQ
RabbitMQ RabbitMQ,作为当今流行的开源消息代理软件,以其卓越的可靠性、灵活性和易用性在微服务架构和分布式系统中扮演着至关重要的角色。它不仅能够确保消息在不同系统组件间的高效传递,还能通过其高级消息队列协议(AMQP&#x…...
leetcode400第N位数字
代码 class Solution {public int findNthDigit(int n) {int base 1;//位数int weight 9;//权重while(n>(long)base*weight){//300n-base*weight;base;weight*10;}//n111 base3 weight900;n--;int res (int)Math.pow(10,base-1)n/base;int index n%base;return String…...
前端网页开发学习(HTML+CSS+JS)有这一篇就够!
目录 HTML教程 ▐ 概述 ▐ 基础语法 ▐ 文本标签 ▐ 列表标签 ▐ 表格标签 ▐ 表单标签 CSS教程 ▐ 概述 ▐ 基础语法 ▐ 选择器 ▐ 修饰文本 ▐ 修饰背景 ▐ 透明度 ▐ 伪类 ▐ 盒子模型 ▐ 浮动 ▐ 定位 JavaScript教程 ▐ 概述 ▐ 基础语法 ▐ 函数 …...
CSS遮罩:mask
CSS属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。 // 一般用位图图片做遮罩 mask: url(~/assets/images/mask.png); mask-size: 100% 100%;// 使用 SVG 图形中的形状来做遮罩 mask: url(~/assets/images/mask.svg#star);…...
Swift闭包的本质
1 闭包的本质其实是一个引用类型:存储在堆空间上,由堆分配空间,且生命周期由ARC(自动引用计数机制)管理 2 捕获值:闭包会捕获上下文使用到的变量(引用类型会保持引用关系)ÿ…...
时代变迁对传统机器人等方向课程的巨大撕裂
2020年之后,全面转型新质课程规划,传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代,电气时代,信息时代;主要生产力-人力转为人脑&…...
【算法设计与分析实训】第1关:求序列的最大字段和
务描述 本关任务:编写用动态规划解决最大字段和问题。 相关知识 为了完成本关任务,你需要掌握:动态规划。 编程要求 给定由n个整数(可能为负数)组成的序列:a1,a2,……,an, 求该序列的最大子段和。当所有整…...
【澜舟科技-注册/登录安全分析报告】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...
【读书笔记-《网络是怎样连接的》- 7】Chapter3_2 路由器
本篇继续介绍路由器及其转发过程。 1 路由器内部结构 路由器内部结构图如图所示。 即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地,端口模块完成包的发送。通过安装不同的硬件,转发模块不仅可以支持以太网,也…...
Android Activity 基础接口知识和常见问题
Activity 知识点及问题点 接口onMultiWindowModeChangedonConfigurationChanged 常见问题Android解决点击桌面图标,就重新启动应用程序问题 接口 onMultiWindowModeChanged 定义 onMultiWindowModeChanged是Android中Activity类的一个回调方法。它会在活动…...
利用python 检测当前目录下的所有PDF 并转化为png 格式
以下是一个完整的 Python 脚本,用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式: import os from pdf2image import convert_from_path# 设置输出图像的 DPI(分辨率) DPI 300# 获取当前目录 current_directory os…...
解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误
前言 在使用 Spring Boot 开发 Web 应用时,经常会遇到各种各样的错误。其中一种常见的错误是 Ambiguous mapping. Cannot map ‘testController‘ method。本文将详细介绍这个错误的原因及解决方法,帮助开发者快速定位并解决问题。 错误解释 这个错误…...
C++ 函数返回值优化
本文中部分内容来自下面的文章,还有一部分来自智谱清言 C 返回值优化_c 局部变量返回优化-CSDN博客 elision:省略 copy elision:拷贝省略 RVO (Return Value Optimization):返回值优化 ------ 我最近也遇到了上面博文中说到的问题&…...
c++源码阅读__ThreadPool__正文阅读
一. 简介 本章我们开始阅读c git 高星开源项目ThreadPool, 这是一个纯c的线程池项目, 并且代码量极小, 非常适合新手阅读 git地址: progschj / ThreadPool 二. 前提知识 为了面对不同读者对c掌握情况不同的情况, 这里我会将基本上稍微值得一说的前提知识点, 全部专门写成一篇…...
关于ES的查询
查询结果那么多字段都是什么? 为什么会提到这个问题呢,因为默认ES查询的结果会有很多信息,我们可能并不希望要那么多数据,所以你需要了解这些字段都表示什么,并正确的返回和使用它们。 took– Elasticsearch 运行查询…...
数据结构初识
目录 1.初识 2.时间复杂度 常见时间复杂度举例: 3.空间复杂度 4.包装类&简单认识泛型 4.1装箱和拆箱 5.泛型 6.泛型的上界 7.泛型方法 8.List接口 1.初识 1.多画图 2.多思考 3.多写代码 4.多做题 牛客网-题库/在线编程/剑指offer 算法篇:…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
