前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【专业技术】反射技术探究

【专业技术】反射技术探究

作者头像
程序员互动联盟
发布2018-03-16 10:58:39
7300
发布2018-03-16 10:58:39
举报
文章被收录于专栏:程序员互动联盟

反射

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为反射机制。反射机制动态获取方法并使用方法和自己直接创建一个类的对象去直接调用时完全不一样的。比如一个类里面有一个属性为private的属性或者方法,我们是不能直接去调用的,但是可以使用反射机制去动态调用。

IOC

IOC最大的好处是把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCSI硬盘了)。在不适用IOC之前一个对象如果依赖于另一个对象(后面我们简称依赖对象和被依赖对象),我们要在依赖对象中实例化一个被依赖对象,这样才能调用被依赖对象中的方法。显然这样耦合度比较高,不符合我们编程的原则。因此这时候我们就会引入一个第三方对象,它负责给依赖对象直接输送一个被依赖对象,降低二者之间的耦合性。下图是加入IOC容器前后,系统中对象耦合度的对比

软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。 软件系统在引入IOC容器之后,这种情形就完全改变了,如图2所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。 通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

实例

反射实例代码

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace StudentDAL
  7. {
  8. public class Student
  9. {
  10. //属性
  11. public string Name{get;set;}
  12. public int Age { get; set; }
  13. //无参数构造函数
  14. public Student()
  15. {
  16. this.Name = "无参数";
  17. this.Age = 0;
  18. }
  19. //有参数构造函数
  20. public Student(string name, int age)
  21. {
  22. this.Name = "name";
  23. this.Age = age;
  24. }
  25. //public带参带返回值函数
  26. public string PublishMethodReturn()
  27. {
  28. return string.Format("我叫"+Name+"年龄" +Age);
  29. }
  30. }
  31. }</strong></span>
  32. <span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
  33. using System.Collections.Generic;
  34. using System.Linq;
  35. using System.Text;
  36. using System.Threading.Tasks;
  37. using System.Reflection;
  38. namespace ITOO_Reflection
  39. {
  40. class Program
  41. {
  42. static void Main(string[] args)
  43. {
  44. //使用 Assembly 定义和加载程序集,
  45. //加载在程序集清单中列出的模块,
  46. //以及从此程序集中查找类型并创建该类型的实例.
  47. //获取程序集
  48. Assembly assembly = Assembly.Load("StudentDAL");
  49. //从程序及获取指定对象类型
  50. Type type = assembly.GetType("StudentDAL.Student");
  51. var instance = assembly.CreateInstance("StudentDAL.Student");
  52. //为学生类的属性赋值
  53. type.GetProperty("Name").SetValue(instance, "shx", null);
  54. type.GetProperty("Age").SetValue(instance, 18, null);
  55. //获取Student类的方法
  56. var method = type.GetMethod("PublishMethodReturn");
  57. //调用Student类的成员方法PublishMethodReturn
  58. var S= method.Invoke(instance, null);
  59. Console.WriteLine(S);
  60. Console.Read();
  61. }
  62. }
  63. }</strong></span>

运行结果

IOC实例代码

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ITOO.IOC.IDAL
  6. {
  7. public interface IUserDal
  8. {
  9. void HelloWord();
  10. }
  11. }
  12. <span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16. using ITOO.IOC.IDAL;
  17. namespace ITOO.IOC.DAL
  18. {
  19. public class User:IUserDal
  20. {
  21. public void HelloWord()
  22. {
  23. Console.WriteLine("helloword");
  24. }
  25. }
  26. }
  27. <span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
  28. using System.Collections.Generic;
  29. using System.Linq;
  30. using System.Text;
  31. namespace ITOO.IOC.IBLL
  32. {
  33. public interface IUserBll
  34. {
  35. void HelloWord();
  36. }
  37. }
  38. <span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
  39. using System.Collections.Generic;
  40. using System.Linq;
  41. using System.Text;
  42. using ITOO.IOC.IBLL;
  43. using ITOO.IOC.IDAL;
  44. using ITOO.Library.Core.AOP;
  45. namespace ITOO.IOC.BLL
  46. {
  47. public class UserBll:IUserBll
  48. {
  49. public void HelloWord()
  50. {
  51. //使用底层封装的SpringHelper从IOC容器中拿到D层的类的对象实例
  52. IUserDal iuser = SpringHelper.GetObject<IUserDal>("User");
  53. iuser.HelloWord();
  54. }
  55. }
  56. }
  57. <span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
  58. using System.Collections.Generic;
  59. using System.Linq;
  60. using System.Text;
  61. using ITOO.IOC.IBLL;
  62. using ITOO.Library.Core.AOP;
  63. namespace ITOO.IOC.Client
  64. {
  65. class Program
  66. {
  67. static void Main(string[] args)
  68. {
  69. //客户端通过底层封装的SpringHelper从IOC容器中根据B层类的对象的id拿到UserBll类的实例
  70. IUserBll iuserbll = SpringHelper.GetObject<IUserBll>("UserBll");
  71. //调用UserBll类的方法
  72. iuserbll.HelloWord();
  73. Console.Read();
  74. }
  75. }
  76. }

运行结果

文章来自:http://blog.csdn.net/u010926964/article/details/47262771

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 反射
  • IOC
  • 实例
    • 反射实例代码
      • 运行结果
        • IOC实例代码
          • 运行结果
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档