深刻理解反射(Reflection)
最近公司在搞自动化测试,由于版权问题,无法用 ’录制脚本‘ 进行,也就没法用 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)的更多相关文章
- [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程
[.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...
- [整理]C#反射(Reflection)详解
本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...
- 代理(Proxy)和反射(Reflection)
前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...
- C# 反射(Reflection)技术
本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点 .Net应用程序是由程序集(Assembly).模块(Module).类型 ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理 梯度计算 基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理 梯度计算 ...
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...
- for循环,你深刻理解了吗?
前几天,有一个面试机会,去看了看,遇到一个认为不错的面试题! 过了几天看到csdn上说华为的一道面试题,看了下和我遇到的很相似! 我分享出来希望大家有帮助! 你真的深刻理解for循环了吗? ...
- CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)
CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...
随机推荐
- python tornado 实现类禅道系统
最近楼主加班 喽, 好久没有更新我的博客了,哎,一言难尽,废话我就不说了,来开始上精华. 背景:目前市面上有很多bug管理工具,但是各有各的特点,最著名,最流行的就是禅道,一个偶然的机会接触到了pyt ...
- [转载]Word直接发布新浪博客(以Word 2013为例)
原文地址:Word直接发布新浪博客(以Word 2013为例)作者:paulke2011 注意:这篇博客直接由Word 2013发出!这虽然也算是一个教程,但更多的是一个试验品. 老早就知道Word有 ...
- ps中如何让图层在画布内水平居中
下图每个小logo图案距离它们的上参考线的距离均为10px,而我们如何让图层在画布内水平居中??? 如上图中三个图层的图案是用来给Html/Css中的background属性使用的,虽然可以通过鼠标拖 ...
- CSS基础知识摘要
元素分类 块级元素 什么是块级元素?在html中<div>. <p>.<h1>.<form>.<table>.<ul> 和 &l ...
- 【2017集美大学1412软工实践_助教博客】团队作业6——展示博客(Alpha版本)
题目 团队作业6: http://www.cnblogs.com/happyzm/p/6791211.html 团队成绩 团队成员简介 项目地址 项目目标,包括典型用户.功能描述.预期用户数量 如何满 ...
- 团队作业8----第二次项目冲刺(beta阶段)5.20
Day2--5.20 1.每日讨论 会议内容:1.新成员乔桦和周迪慢慢了解项目. 2.组内负责主要编程的益靖对代码进行了大概的说明. 3.对昨天的工作进行了几点总结. 4.组长对每个成员的任务完成了分 ...
- 201521123054《JAVA程序设计》第三周学习总结
本周学习总结 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; public st ...
- 201521123054《java程序设计》第12周学习总结
1. 本周学习总结 2. 书面作业 1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 1.1 生成的三个学生对象,使用PrintWriter的printl ...
- 201521123014 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 数据库是为了实现一定目的按某种规则组织起来的"数据"的"集合".常见的数 ...
- C#设计模式之二简单工厂模式(过渡模式)
一.引言 之所以写这个系列,是了为了自己更好的理解设计模式,也为新手提供一些帮助,我都是用最简单的.最生活化的实例来说明.在上一篇文章中讲解了单例模式,今天就给大家讲一个比较简单的模式--简单工厂模式 ...