反射与IOC

反射

  反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为反射机制。反射机制动态获取方法并使用方法和自己直接创建一个类的对象去直接调用时完全不一样的。比如一个类里面有一个属性为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的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

实例

反射实例代码

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StudentDAL
{
    public class Student
    {
        //属性
        public string Name{get;set;}
        public int Age { get; set; }

        //无参数构造函数
        public Student()
        {
            this.Name = "无参数";
            this.Age = 0;

        }
        //有参数构造函数
        public Student(string name, int age)
        {
            this.Name = "name";
            this.Age = age;
        }

        //public带参带返回值函数
        public string PublishMethodReturn()
        {
            return string.Format("我叫"+Name+"年龄" +Age);
        }
    }
}</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace ITOO_Reflection
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用 Assembly 定义和加载程序集,
            //加载在程序集清单中列出的模块,
            //以及从此程序集中查找类型并创建该类型的实例.
            //获取程序集
            Assembly assembly = Assembly.Load("StudentDAL");
            //从程序及获取指定对象类型
            Type type = assembly.GetType("StudentDAL.Student");
            var instance = assembly.CreateInstance("StudentDAL.Student");
            //为学生类的属性赋值
            type.GetProperty("Name").SetValue(instance, "shx", null);
            type.GetProperty("Age").SetValue(instance, 18, null);
            //获取Student类的方法
            var method = type.GetMethod("PublishMethodReturn");
            //调用Student类的成员方法PublishMethodReturn
            var S= method.Invoke(instance, null);

            Console.WriteLine(S);
            Console.Read();
        }
    }
}</strong></span>

运行结果

IOC实例代码

<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ITOO.IOC.IDAL
{
    public interface IUserDal
    {
        void HelloWord();
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.IOC.IDAL;

namespace ITOO.IOC.DAL
{
    public class User:IUserDal
    {
        public void HelloWord()
        {
            Console.WriteLine("helloword");
        }
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ITOO.IOC.IBLL
{
    public interface IUserBll
    {
        void HelloWord();
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.IOC.IBLL;
using ITOO.IOC.IDAL;
using ITOO.Library.Core.AOP;

namespace ITOO.IOC.BLL
{
    public class UserBll:IUserBll
    {
        public void HelloWord()
        {
            //使用底层封装的SpringHelper从IOC容器中拿到D层的类的对象实例
            IUserDal iuser = SpringHelper.GetObject<IUserDal>("User");
            iuser.HelloWord();
        }
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.IOC.IBLL;
using ITOO.Library.Core.AOP;

namespace ITOO.IOC.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //客户端通过底层封装的SpringHelper从IOC容器中根据B层类的对象的id拿到UserBll类的实例
            IUserBll iuserbll = SpringHelper.GetObject<IUserBll>("UserBll");
            //调用UserBll类的方法
            iuserbll.HelloWord();
            Console.Read();
        }
    }
}
</strong></span>

运行结果

  以上内容是本人根据网上大牛的分享以及其他资料的一些整理和理解,有不足之处请大家批评指正。

版权声明:本文为博主原创文章,转载请标明出处,谢谢!

时间: 2024-11-05 21:50:37

反射与IOC的相关文章

【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 上上篇博文[SSH进阶之路]一步步重构容器实现Spring框架--

Java反射及 IoC原理、内省机制

JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性. 1.2 反射机制的作用 在运行时判断任

通过反射实现IOC功能

这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六,女朋友去加班了(也是一枚标准的程序媛,做java开发),闲来没事,自己就想着根据反射可以自己写一个简易的IOC组件.IOC组件说白了就是根据反射实例化对应的接口.废话不多说,开始说说我的解决方案. 1.项目结构图: IOCTest为web MVC项目. Common 通过配置文件实例化对应的接口

C#反射Assembly IoC的一个实例

1.定义一个抽象类ServiceFactory,用来得到T接口的实现对象 public abstract class ServiceFactory { public abstract T CreateService<T>() where T : class; } 2.首先通过反射机制得到该interface的名字.得到该interface的实现实例后并缓存它. /// <summary> /// 直接引用提供服务 /// </summary> public class

模拟实现Spring IoC功能

为了加深理解Spring 今天自己写了一个模拟的Spring.... 步骤: 1.利用jdom解析bean.xml 2.创建ClassPathXmlApplicaitonContext用于模拟IoC 3.先解析所有的<bean/>,再解析所有的<property/>.如果边解析<bean/>,边解析<property/>,会导致property的ref找不到对应的bean. 4.利用简单的反射实现Ioc. 目录结构: 这里只给出核心代码,其余的bean,da

Spring之IOC实现原理

前段时间写了篇关于Spring的AOP框架实现原理的文章,现在浅谈下Spring的另一大核心概念IOC的原理. IOC:即控制反转.官方解释是让调用类对某一接口实现类的依赖关系由第三方注入,以转移调用类对某一接口实现类的依赖. 下面将举个现实例子加深理解: "剧本"要选定"角色"的"饰演者",我们可以创建第三方"导演"来控制"剧本",引入"导演","剧本"和"

OOP、DI、IOC的关系

此随笔的重点在“Demo分析”一章,以代码的分阶段变化讲述了DI,DIP,IOC的演变,写在前面文字均为铺垫. 希望各位园友拍砖,促使流浪者的进步,现在有很多问题想讨论,即以此文寻找志同道合的园友,另此文草草写作,发现越写越觉得还有很多没有描述出来,暂且如此,等待过些时日再来总结,草草之作难免有错误之处,忘各位园友斧正,不甚感激! 先来个简介,看不懂没关系,按着顺序看下去等Demo看完就明白了,简介只是为了有个宏观的概念,强烈建议看完Demo分析后再重读一遍: 1. DI: 有了OO,抽象封装为

淘宝技术发展

转载 http://blog.csdn.net/kobejayandy/article/details/8685271 目录 一.引言 二.个人网站 三.Oracle/支付宝/旺旺 四.淘宝技术发展(Java时代:脱胎换骨) 五.淘宝技术发展(Java时代:坚若磐石) 六.淘宝技术发展(Java时代:创造技术-TFS) 七.淘宝技术发展(分布式时代:服务化) 作者:赵超 一.引言 光棍节的狂欢 “时间到,开抢!”坐在电脑前早已等待多时的小美一看时间已到 2011 年 11 月 11 日零时,便迫

未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件

连续两天都为这个运行时错误“类型初始值设定项引发异常”而烦恼,调试也不知道哪里出了问题.上网Google一下,一大堆相同的问题,可是按照那些方法折腾来折腾去,问题还是一样.最后在CSDN上发帖子问了,果然“重赏之下必有勇夫”,很快就有高手回复了,问题也随着解决了.哈哈.在此写个随笔,以后如果大家遇到类似问题,也可参考一下,自己也做个备忘,不然放在电脑上,又找不到,我的电脑文件到处乱放,有时连我自己都找不到^_^. 问题是这样嘀: 项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这