首页 新闻 会员 周边 捐助

求解:什么情况下需要使用反射,为什么要用反射(反射是最好的方法或者放射是唯一的方法吗)?

0
[待解决问题]

由于反射这个东西晦涩难懂,一直以来没好好去了解过,最近因病在家休养无聊便想着去了解一下,但是看了好几个视频好几篇文章了,还是没懂在项目中,在代码中什么地方要使用反射,以及为什么要使用反射,难道没有别的简单的方法技巧吗?
还有在看过的文章中都出现过一个例子场景:拿一个已知的的类做例子。小白想问下都知道要使用的类了,为什么不能直接实例化使用?(其实还是不知道他们举例的场景为什么就要用反射)

白鲟的主页 白鲟 | 初学一级 | 园豆:29
提问于:2022-06-30 18:12
< >
分享
所有回答(9)
0

你可以考虑这么一个场景:自己实现对象的字段拷贝,这个时候也是已知的类

飒沓流星 | 园豆:1099 (小虾三级) | 2022-06-30 18:54
0

初踏入开发反射的使用不多
写框架或者基础服务的情况下,这种会常用,比如从json字符串反序列化成一个对象类,fastjson jackson等等这些库,都是使用这种方式

2012 | 园豆:21645 (高人七级) | 2022-06-30 19:00
0

需要根据类名实例化对象或者是根据属性名称从一个对象里取值时。比如根据模板生成word文件,我可能在模板里标记了A,生成word时要从一个对象里取属性名称为A的属性的值来代替模板里的A。

会长 | 园豆:12463 (专家六级) | 2022-06-30 19:09

能说详细一点吗?我不明白你说的这个场景下为什么不能直接用new实例化对象

支持(0) 反对(0) 白鲟 | 园豆:29 (初学一级) | 2022-06-30 20:35

@白鲟: 等你用到的时候自然就懂了,不用纠结

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2022-07-01 09:14
0

这里以C#为例,通常通过反射批量注入程序集到宿主程序。

参考:

楠木大叔 | 园豆:2083 (老鸟四级) | 2022-06-30 21:36

好的,我看看去

支持(0) 反对(0) 白鲟 | 园豆:29 (初学一级) | 2022-07-01 00:27
0

借#2, #3 出一个面试题, 感觉做完这2题应该能对反射理解的差不多了.

实现一个json序列化方法
string SerializeToJson<T>(T obj);

class A{string FieldA; }
class B:A{string FieldA; string FieldB}
//输出例子
SerializeToJson(new A(){FieldA="ABC"}) ==> {"FieldA":"ABC"}
SerializeToJson(new B(){FieldA="ABC", FieldB="DEF"}) ==> {"FieldA":"ABC", "FieldB":"EDF"}

实现一个模板解析方法
string Parser<T>(string template, T obj)
输出例子

Parser("MyTemplatestring '{FieldA}' done.", new A(){FieldA="ABC"}) 
==>
MyTemplatestring 'ABC' done.

Parser("MyFieldA is {FieldA}, balalala MyFieldA is '{FieldB}'", new B(){FieldA="ABC", FieldB="DEF"}) 
==> 
MyFieldA is ABC, balalala MyFieldA is 'DEF'
czd890 | 园豆:14488 (专家六级) | 2022-06-30 23:13




结果是对了,还请大佬帮忙看下语法有没有什么不对的地方

支持(0) 反对(0) 白鲟 | 园豆:29 (初学一级) | 2022-07-01 16:25
0

举个例子,你编写了一个winform的应用程序,然后某一天,老板说,增加一个功能模块 1234,然后由于现有程序大家都在用,所以在不影响现有程序的情况下,作为一个插件,加入到现有程序,这样现有程序就多了一个模块,那么如何在现有程序运行的前提下,通过插件的方式加入呢?那就用到了反射。

neverlost | 园豆:570 (小虾三级) | 2022-07-04 21:38
0

四个字 简化代码

按时睡觉。 | 园豆:190 (初学一级) | 2022-07-11 09:37
0

举例的时候自然举已知的类或者程序集让你对照嘛。
实际使用中,如果涉及对一些未知Class或者Assembly的解析,就要用到反射了。

  1. 最常见的就是IDE的属性面板,加载一个对象后,它所有的属性都要显示在面板上,而这个对象点击前是未知的,可能是一个按钮有10个属性,也可能是一个文本框有15个属性,不可能硬编码的,反射遍历每个对象的属性就是个很好的方法。
  2. 还要就是代码生成器,它生成代码的时候可能需要参考输入的用户代码,比如ASP.NET代码生成器生成View和Controller的时候,需要参考用户的Model代码里的属性以及属性上标注的Attribute来生成对应的代码,比如要不要生成验证代码等等。
  3. 还有很常见的依赖注入,通过配置文件改一下要注入的类的名字String,依赖注入框架就自动识别了要注入的类了,它就用到了反射,只改配置的xml或者json就行了,无需更改主程序。
    总之就是有很多东西运行的时候才能确定,这时候反射就派上用场了。
xsz1234 | 园豆:39 (初学一级) | 2022-07-20 18:36
0

因为需要进一步抽象,类级别的抽象只能抽象到类和实例,字段级别的抽象能到key,value,其中key为字段名称,value为字段值。

蜗牛旅行1899 | 园豆:285 (菜鸟二级) | 2024-05-15 14:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册