反射

Posted 飘雨的河

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射相关的知识,希望对你有一定的参考价值。

反射

反射反射程序员的快乐,反射是无处不在的,封装框架,系统开发,MVC,IOC,ORM都离不开反射。

一、反射/反编译工具/高级语言到计算机语言的历程

  1. 高级语言---编译---dll/exe文件
  2. metadata:元数据清单---记录了dll中包含哪些东西,是一个描述。
  3. IL:中间语言---编译把高级语言编译后得到c#中最真实的言语状态,面向对象语言。
  4. 反编译工具:逆向工程;ILSPY --- DLL/EXE、 --- 反编译回来,c#/IL
  5. 反射: 来自于System.Reflection,是一个帮助类库---可以读取DLL/EXE中metadata和使用metadata + 动态的创建dll/exe --- Emit技术

二、反射创建对象

首先定义一个接口

namespace Business.DB.Interface

    /// <summary>
    /// 数据访问类抽象
    /// </summary>
    public interface IDBHelper
    
        void Query();
    


实现了接口的类

namespace Business.DB.SqlServer

    public class SqlServerHelper
    
        //Nuget:System.Data.SqlClient

        private string ConnectionString = "Data Source=DESKTOP-VUL99EF; Database=CustomerDB; User ID=sa; Password=sa123; MultipleActiveResultSets=True";

        private static string GetConnection()
        
            //Nuget引入:
            //SetBasePath:Microsoft.Extensions.Configuration.FileExtensions
            //AddJsonFile:Microsoft.Extensions.Configuration.Json 
            var Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true)
                .Build();
            return Configuration.GetConnectionString("Default");
        


        public SqlServerHelper()
        
            Console.WriteLine($"this.GetType().Name被构造");
        

        //public SqlServerHelper(int i)
        //
        //    Console.WriteLine($"this.GetType().Name被构造");
        //

        public void Query()
        
            Console.WriteLine($"this.GetType().Name.Query");
        
    

我们开始尝试通过反射创建对象

//传统方式创建对象
IDBHelper dbHelper=new SqlServerHelper();

反射的方式

  1. 动态读取DLL
  2. LoadFrom: dll全名称,需要后缀
  3. LoadFile: 全路径,需要DLL后缀
  4. Load: dll名称,不需要后缀
  5. 获取某一个具体的类型:参数需要是类的全名称;
  6. 创建对象
  7. 类型转换
  8. 调用方法
Assembly assembly =Assembly.LoadFrom("Business.DB.SqlServer.dll");
//Assembly assembly1=Assembly.LoadFile(@"E:\\VS项目\\2022年vs项目\\ReLearn\\ReLearn\\bin\\Debug\\net7.0\\Business.DB.SqlServer.dll");
//Assembly assembly2=Assembly.Load("Business.DB.SqlServer");
Type type= assembly.GetType("Business.DB.SqlServer.SqlServerHelper");
object? oInstance= Activator.CreateInstance(type);

//oInstance.Query(); //报错。因为oInstance当做是一个object类型,object类型是没有Query方法的;
//C#语言是一个强类型语言:编译时你是什么类型,以左边为准;不能调用是因为编译器不允许;实际类型一定是SqlServerHelper类型;

//如果使用dynamic 作为类型的声明,在调用的时候,没有限制;
//dynamic:动态类型;不是编译时决定类型,避开编译器的检查;运行时决定是什么类型
//dynamic oInstance1= Activator.CreateInstance(type);
//oInstance1.Query();
//oInstance1.Get(); //报错了,因为SqlServerHelper没有Get方法。

SqlServerHelper  sqlServerHelper = oInstance as SqlServerHelper;

sqlServerHelper.Query();

条件反射和非条件反射的各10个例子都有哪些?

经典条件反射 (又称巴甫洛夫条件反射),是指一个刺激和另一个带有奖赏或惩罚的无条件刺激多次联结,可使个体学会在单独呈现该一刺激时,也能引发类似无条件反应的条件反应。

条件反射的例子:谈梅生津、谈虎色变、画饼充饥、睡觉认床、摇尾乞怜等。


无条件反射亦称非条件反射,是外界刺激与有机体反应之间与生俱来的固定神经联系。或在出生后发挥作用,或随着有机体的生长发育而出现。

非条件反射例子:

小孩子一打针就哭、 吃杨梅时分泌唾液、 膝跳反射、 缩手反射、 眨眼反射、 婴儿的吮吸反射等。

参考技术A 条件反射:1.训练过的狗能对铃声做出分泌唾液的反应
2.望梅止渴
3.画饼充饥·
4.看到酸梅就分泌唾液
5。谈虎色变
6,。一朝被蛇咬,十年怕草绳
7.鹦鹉学舌
8.闻鸡起舞
9。看见红灯停步

非条件反射:
1.膝跳反应
2.针刺指尖引起的缩手
3.当别人朝你挥舞拳头时会眨眼
4,遇到强光后马上闭眼
5婴儿吮吸乳头
6.吃酸梅分泌唾液
7.手碰到火后立即回缩8
8.听到雷声吓一大跳
9.排尿反射
10.飞蛾扑火
参考技术B 非条件反射是指不依赖于特定刺激情境而作出的反应,是在个体发生后,生来就有的先天性反射。非条件反射一般在出生后最初几个月内形成,是在个体与环境互动的过程中逐渐建立起来的。例如吮吸反射、抓握反射、行走反射、游泳反射等。条件反射是指由生理或环境因素而形成的反射,是后天获得的,是在非条件反射的基础上建立起来的,是在个体与环境的交互作用中形成的。

以上是关于反射的主要内容,如果未能解决你的问题,请参考以下文章

注解和反射反射获取泛型反射获取注解

菲尼尔反射的反射原理

条件反射和非条件反射的各10个例子都有哪些?

请例出条件反射和非条件反射的例子各3个

各举出条件反射和非条件反射的10个例子。

类的反射 对象的反射 模块的反射