.Net反射机制

现在谈.Net反射机制本不在计划中,因为本打算研究完设计模式后再去学习别的技术;但迫于设计模式系列一创建型之(抽象工厂模式)一章中遗留问题,才不得已在设计模式之游中插入本篇文章!签于本人对反射理解也不够深入,这里也只做些简单介绍,详见MSDN;大牛们无须光顾!



1、反射简介

  • 概念:

      .Net 中Reflection翻译为“反射”,是.Net中获取运行时类型信息的一种方式。.Net的应用程序由几个部分:程序集(Assembly)、模块(Module)、类型 (class)组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

  • 作用:
    1. Assembly类可以获得正在运行的装配件信息
    2. 可以动态的加载装配件
    3. 在装配件中查找类型信息
    4. 创建该类型的实例

第一次看到这样的词相信你也会不知所以然!一个很通俗的东东,一旦用专业术语表述就像很高雅。从字面意思根本无法明白它在.Net中是什么?通俗的讲,在形成最终的.exe或.dll之前,那些不相关的和相关的东西(比如说很多类)要打成包组装在一起,这些东西就叫做装配件。我们直接把它理解为exe和dll就可以了。 

  

2、反射应用

  1. Type类于获取类型信息

  System.Type 类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个 Type。可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。

以下所有均以设计模式系列一创建型之(抽象工厂模式)章节中为例:

      static void Main(string[] args)
        {
            ChinaFactory factory = new ChinaFactory();
            Type type = factory.GetType();
            Console.WriteLine(
                    "类型名:" + type.Name
                    + "\n类全名:" + type.FullName
                    + "\n命名空间名:" + type.Namespace
                    + "\n程序集名:" + type.Assembly
                    + "\n模块wei名:" + type.Module
                    + "\n基类名:" + type.BaseType
                    + "\n是否为类:" + type.IsClass
                );
            Console.ReadLine();
        }

运行结果:

  2.获取程序集元数据

  Assembly类定义了一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。因为程序集中是使用元数据进行自我描述的,所以我们就能通过其元数据得到程序集内部的构成。结合Assembly和反射能够获取程序集的元数据,但是首先要将程序集装入内存中。可以使用Assembly类的多种静态Load方法加载程序集。

            //获取当前执行代码的程序集
            Assembly assem = Assembly.GetExecutingAssembly();
            Console.WriteLine("程序集全名:" + assem.FullName);
            Console.WriteLine("程序集的版本:" + assem.GetName().Version);
            Console.WriteLine("程序集初始位置:" + assem.CodeBase);
            Console.WriteLine("程序集位置:" + assem.Location);
            Console.WriteLine("程序集入口:" + assem.EntryPoint);
            Type[] types = assem.GetTypes();
            Console.WriteLine("程序集下包含的类型:");
            foreach (var item in types)
            {
                Console.WriteLine("类:" + item.Name);
            }

            Console.ReadLine();    

运行结果:

  

  3.动态加载类型

  早绑定是在编译时绑定对象类型,而晚绑定是在运行时才绑定对象的类型。利用反射可以实现晚绑定,即动态加载类型,并调用他们的方法。听着挺神奇的,下面让我们爽一把:

            //获取当前执行代码的程序集
            Assembly assem = Assembly.GetExecutingAssembly();
            //从程序集中创建一个ChinaFactory实例并且用object类型的引用obj指向它
            object obj = assem.CreateInstance("抽象工厂模式.ChinaFactory", false);
            MethodInfo m = assem.GetType("抽象工厂模式.ChinaFactory").GetMethod("CreateBonus");
            object objRet = m.Invoke(obj, null);
            Console.WriteLine("CreateBonus returned {0}.", objRet);
            //CreateBonus 返回IBonus类型
            IBonus bonus = m.Invoke(obj, null) as IBonus;
            Console.WriteLine(bonus.Calculate());

            Console.ReadLine();

运行结果:

果真是强大!Ok,体验了一把也对反射有了一些简单的认知,下面就开始解决遗留的问题:如何解决抽象工厂中判断分支问题?

3、解决遗留问题

其实应用反射很简单:

    /// <summary>
    /// AbstractFactory
    /// </summary>
    public abstract class AbstractFactory
    {
        public static AbstractFactory GetInstance()
        {
            string factoryName = ConfigurationManager.AppSettings["factoryName"];
            AbstractFactory instance;
            if (!string.IsNullOrEmpty(factoryName))
            {
                Assembly ass = Assembly.GetExecutingAssembly();
                //动态创建类型
                instance = (AbstractFactory)ass.CreateInstance("抽象工厂模式." + factoryName);
            }
            else
            {
                instance = null;
            }
            return instance;
        }
        public abstract IBonus CreateBonus();
        public abstract ITax CreateTax();
    }

这样看上去舒服多了,无论代码怎么变迁,我们只需要修改配置文件就Ok!

4、总结

以上只是反射的基本应用,其真正的实现原理还需继续深入探讨!

时间: 2024-11-11 23:26:40

.Net反射机制的相关文章

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

Java反射机制

Java的反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 反射的作用 1 可以反编译将class文件编译成java文件 2 可以通过反射机制访问Java对象的属性,方法,构造方法等 反射机制使用步骤 1 得到要调用类的class 2 通过得到的c

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

反射机制

反射机制: 反射机制是能够帮助我们把代码变得更加灵活,可扩展性更高,俗称"软编程.软写法".例如:有一个文件里面有一些值,想要把这些值赋值到一个Student类的属性中,按照以前所学到的知识点,只能是通过文件流将文件里的值读取出来,然后再通过set方法将这些值都赋给Student类的属性.但是,这种方式是将代码写死了,在这之后会有一个问题就是如果文件里的内容发生变动,或者要把这个Student类更换成Dog类的话,就要重新修改代码.程序写好了部署到服务器上运行了,总不能时不时就打开来修

Python学习心得(六) 反射机制、装饰器

1.反射机制 #/usr/bin/env python # -*- coding:utf-8 -*- ''' Python反射机制的核心本质:利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动 通俗讲就是通过用户传入url的不同,调用不同的模块函数,好多比较流行的web框架都是通过反射的机制,根据url的不同指向不同的模块 getattr(),hasattr(),setattr(),delattr()对模块的修改都在内存中进行,并不会影响文件中的真实内容

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java的反射机制简述

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许内部的成员进行操作.虽然这个特性在实际开发中使用的不多,但是像Pascal.C和C++等语言根本没有提供这样的特性.由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制也会严重影响系统的性能. 具体而言,反射机制提供的功能主要有: 1.得到一个对象所属的类: 2.获取一个类的所有成员变量和方法: 3.在运行时创建对象: 4.在运行时调用对象的方法. 其实,反射机制非常重要

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i