缠丝猫 发表于 2024-10-28 16:28:33

UnityC#反射底层原理

 一、C#对象的内存结构

https://i-blog.csdnimg.cn/direct/8ebf794fc9214722849ec59a8f7b8f90.png
 二、this实例的概念

 成员函数内里,如果我们使用this,指的就是当前的对象实例;
https://i-blog.csdnimg.cn/direct/5d532601d7b24025a4958954c526be95.png
https://i-blog.csdnimg.cn/direct/02f6abf9d0b14c65bc6513635ce46456.png 
调用这个成员函数的时间,我们会主动给成员函数,把当前的对象的实例作为this传入进去;
https://i-blog.csdnimg.cn/direct/55e22056945444c280942a889627c5e4.png 
类的实例:类的数据成员的所有数据(看得见的,age,4个字节,sex,四个字节,string 引用类型变量(4字节),32位体系下)
看不见的数据:编译器对齐;
https://i-blog.csdnimg.cn/direct/311f1665fcbd490a86c70fc0d7846f28.png
组成了一个类的实例;t-->一块内存,写好代码以后编译器会定死一个偏移,age,在我对象实例内里,内存偏移多少,大小为age类型
当我们编写好一个类型以后,
(1)我们的编译器会知道每个数据的相对于对象实例内存块的偏移;
(2)我们编译器也会知道,每个类的成员函数在代码段偏移位置;--》运行的时间,就可以让指令直接跳转到这里,函数调用;
三、什么是反射,反射有什么作用

   Unity游戏引擎为例,来看反射的作用
Unity:编译器上挂脚本,我们给脚本初始化数据
编辑完了以后---》保存到场景文件内里
运行的时间,我们就根据场景文件内里的内容,游戏引擎把这个节点和组件实例new出来
https://i-blog.csdnimg.cn/direct/81dfad53cf7e4c48b30140e674c96aab.png
反射来做
https://i-blog.csdnimg.cn/direct/163ceb6e42084a06b9a4ba188d0fbde3.png
 上面我们形貌一个类,每一个类是一种类型,都有本身独立的形貌
以是我们新加一个类,就会有多的一种方式来形貌
我们没有办法用统一的方式来处置惩罚不同的类或类的实例
要办理上述我们问题的本质抵牾是什么?
 需要用一种方式来形貌任意的类
任意的类,都可以转化成这样一种形貌
   a:类的实例是一个内存块,内存块的大小就是这个类的所有数据成员的大小-----》类的实例的内存块大小
b:类有哪些数据成员,我们可以把这些数据成员的名字,通过数组等其他方式保存起来
数据成员数组:
https://i-blog.csdnimg.cn/direct/b88332e8b54c44db8ac605fa8983ec0a.png
c:类有哪些成员函数
https://i-blog.csdnimg.cn/direct/d071289e924d46958bb2124c3fafa053.png
定义了这样一种形貌方式,我们就办理上面的问题,我们用同一的方式来形貌任意不同的类型

四、类型形貌 对象实例(Type,System)是什么
每个类,我们的编译器都知道 数据成员的偏移,函数代码段的位置
https://i-blog.csdnimg.cn/direct/609029694ee0470ea5d4d5cd9a78544a.png
https://i-blog.csdnimg.cn/direct/af359a31f96843e8b22637e9ec3cbbfe.png
https://i-blog.csdnimg.cn/direct/44fb6fc521d640889d96345e7a4b018e.png
编译完成了以后,我们就可以根据我们的编译信息,来为每个类,来天生一个
类型形貌的对象的数据,存起来,写入到我们的.exe
我们的就可以使用了Type的方式来得到一个类的形貌
底层就可以根据类的形貌来构建实例,调用方法,和成员了
调用底层OS的API来分配一个xxxx大小的内存出来,作为对象实例的内存
调用构造函数,将这个内存块传递给构造函数,构造函数就会帮我们初始化对应的数据
https://i-blog.csdnimg.cn/direct/6e2c50ee698348a0bf22a64924126dc6.png
https://i-blog.csdnimg.cn/direct/7fe4cc36ad8a4a199f1f71728c86ca2a.png
https://i-blog.csdnimg.cn/direct/02bf74fcd81c4156bdfed7a6f7ab1862.png
https://i-blog.csdnimg.cn/direct/e2da408736dd4257b2a05cdfd5a348ef.png


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: UnityC#反射底层原理