最近公司在搞自动化测试,由于版权问题,无法用 ’录制脚本‘ 进行,也就没法用 VS 自带的 UITest 框架(蛋疼), 所以只能开源的 FlaUI 框架来搞了。其中不可避免的涉及到反射的应用,但自己有些概念还是有点模糊不清, 干脆集中将自己个人的理解整理一下。

一、前提

要理解反射首先要理解 特性 的概念,因为反射通常需要获取用户自定义属性。

特性(Attribute)

概念: 用于在运行时传递程序中各种元素(类,方法等)的行为信息的声明性标签。

声明方法:在它所应用的元素(类, 方法等)面前防止方框号([ ]), ig. [SayHelloAttribute]。

主要作用:对应用的元素添加元数据, 程序可以使用反射检查获取自己的元数据或者其它元素内的元数据。

可以这么理解元数据的概念:程序集中所有关于声明类的数据信息(成员函数, 属性, 方法调用)等都储存在元数据里面(pdb 文件)。

如果还不理解特性的概念, 点这里 https://en.wikipedia.org/wiki/Attribute_(computing)

二、 概念

反射: 指程序可以访问、检测和修改它本身状态或行为的一种动作。

作用: 通过反射, 可以在运行时获取指定程序集(dll 集合) 每一个类型(包括类、结构、委托、接口等)的成员(方法、事件、属性等)。

三、用途

反射可以作用在程序集上, 程序集包含模块, 模块包含类型,类型又包含成员, 反射可以对封装程序集、模块、类以及成员进行操作。通常,使用反射动态的创建类型的实例, 将类型绑定到现有对象(或从现有对象获取类型), 然后调用类型的方法。

最常见用途如下:

1、使用 Assembly 定义和加载程序集, 并提取指定的类型集合。

如下所示, 加载 "ReflectionTest.exe"  , 提取程序中有 “HelloAttribute" 属性的类。

 Assembly a = Assembly.Load("ReflectionTest.exe");
// 当 dll 与 类唯一时, 以下两种获取 type 方式等效
// 与下面方式等效 Type assType = typeof(HelloWorld);
Type[] assTypes = a.GetTypes();
foreach (Type assType in assTypes)
{
object[] attributes = assType.GetCustomAttributes(typeof(HelloAttribute), false);
}

2、使用 MethodInfo 了解方法的名称, 返回类型,参数 以及实现信息。

 // HellowWord 是一个类
1 Type = Typeof(HelloWord)
var m = t.GetMethods();
foreach (MethodInfo mInfo in m)
{
// 此处考虑了 attributeMutiple = true 的情况
foreach (Attribute aa in mInfo.GetCustomAttributes(true))
{
HelloAttribute d = aa as HelloAttribute;
if (null != d)
{
Console.WriteLine("the method is you wanted: {0}", m);
}
}
}

3、实例化对象, 调用方法

 Type t = typeof(HelloWorld);
// 实例化 HelloWorld
Object obj = Activator.CreateInstance(t); // 调用 Hello 方法(’Hello‘ 方法在 ’HelloWorld‘ 类中已经实现过)
MethodInfo custHello = t.GetMethod("Hello")
custHello.Invoke(parame) // parame 指的是对应的参数。

本次用到的方法主要是以上三种,这次也先写这么多,后期用到其它方法,再来更新。

深刻理解反射(Reflection)的更多相关文章

  1. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  2. [整理]C#反射(Reflection)详解

    本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...

  3. 代理(Proxy)和反射(Reflection)

    前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...

  4. C# 反射(Reflection)技术

    本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点         .Net应用程序是由程序集(Assembly).模块(Module).类型 ...

  5. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  6. Atitit 图像处理 深刻理解梯度原理计算.v1 qc8

    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理  梯度计算  基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理  梯度计算 ...

  7. 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

    声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...

  8. for循环,你深刻理解了吗?

    前几天,有一个面试机会,去看了看,遇到一个认为不错的面试题!   过了几天看到csdn上说华为的一道面试题,看了下和我遇到的很相似!   我分享出来希望大家有帮助!   你真的深刻理解for循环了吗? ...

  9. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

随机推荐

  1. 团队作业8----第二次项目冲刺(beta阶段)5.22

    Day4-05.22 1.每日会议 会议内容: 1.帮助新成员进一步了解项目. 2.陈鑫龙说明昨日任务的完成情况. 3.组长林乔桦安排今日的任务. 讨论照片: 2.任务分配情况: 每个人的工作分配表: ...

  2. 201521123057 《Java程序设计》 第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 答:remove中注意应该使用eq ...

  3. [转载]请教各位高手光盘版或者U盘版的BT保存配置的问题

    这样安装的bt4默认是不能保存配置的,每次你更改了设置,下次重启又没有了.在网上下载一个叫做"saveFile.rar"的压缩包,大小40K左右,这个是bt4能够保存配置关键,当然 ...

  4. 201521123106 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  5. java System.currentTimeMillis()毫秒值和具体日期值互相转换

    System.currentTimeMillis()与日期 间是可以相互转换的,通过 SimpleDateFormat dateformat = new SimpleDateFormat(" ...

  6. 运用GRASP原则来做uml交互类图-------pos机实例

    重要的几个GRASP原则:1.控制器模式   2.创建者模式 (原则)3.信息专家模式(原则) 4. 高内聚 低耦合   这里所说的模式并不是java中针对具体的事件的设计模式 主成功场景的几个操作: ...

  7. centOS7网络配置(nmcli,bonding,网络组)

    关于网络接口命名 CentOS 6之前,网络接口使用连续号码命名: eth0. eth1等,当增加或删除网卡时,名称可能会发生变化.CentOS 7使用基于硬件,设备拓扑和设置类型命名. 网卡命名机制 ...

  8. Mysql免安装版配置【图文版和文字版】

    图文版 配置环境变量 新建一个my.ini文件,添加下面内容 [mysqld] basedir=C:\\software\Mysql\mysql-5.7.14-winx64 datadir=C:\\s ...

  9. 代码的完整性:打印1到最大的n位数

    输入数字n,按顺序打印出从1到最大的n位十进制数. 比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999. 全排列打印 public class Main { public sta ...

  10. spring boot基础 入门

    spring boot基础 spring boot 的简单搭建 spring boot 的基本用法 spring boot 基本用法 自动配置 技术集成 性能监控 源码解析 工程的构建 创建一个mav ...