【反射】教你在十分钟内学会反射

标签: 反射 反射 | 发表时间:2011-10-18 18:11 | 作者:Zeech_Lee Xin
出处:http://www.cnblogs.com/

  反射,提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。其实反射很简单的,理解了调用的过程再自己动手做几个实例基本上就能熟悉了。

  对于反射,我们需要准备好一个类库,编译出DLL文件,然后通过System.Reflection命名空间下的 Assembly类来加载这个程序集:

Assembly  asb = Assembly.LoadFrom(@"D:\project\Calculate\Calculate\bin\Debug\Calculate.dll");

说到加载程序集,有两种方法Assembly.LoadFrom和Assembly.Load,前者是需要一个绝对路径;后者是需要程序集名就可以了,但是必须在程序启动时这个程序集会随着程序启动而加载。

调用反射的流程:

首先获得一个程序集,你是不知道里面有什么类,类的构造什么,具体类里面有什么方法、属性和字段等。所以必须先获得关于类的信息,然后写成一个文档以便于后面开发使用。

加载好程序集后可以使用GetTypes()来获取类名:

我们可以通过遍历来获类名和属于该类下的方法等:

View Code
1  Type[] type = asb.GetTypes();
2 foreach (Type item in type)
3 {
4
5 for (int i = 0; i <item.GetMethods().Length-1; i++)
6 {
7 listView1.Items.Add(item.ToString());
8 listView1.Items[i].SubItems.Add(item.GetMethods()[i].ToString());
9 }

既然我们知道了程序集里面的类以及类的信息,当然包括了方法的返回值类型以及需要传入的参数,调用方法也就简单了,有两种方法:

一:

1.先实例化一个Type来获取调用类的类型,这样就获取到了类的类型了。

2.调用一个类里的方法,必须先实例化一个类的对象利用Activator.CreateInstance(Type type);来创建实例化对象

3.这下就可以调用方法了。MethodInfo mi = t.GetMethod(Function name)传入需要调用的方法名

4.最后就是执行方法了, mi.Invoke(obj, Object Object[]);

二:

1和2都是同上;

3.通过类型来调用方法 t.InvokeMember(Function name,BindingFlags.InvokeMethod, null, obj, null),当然里面需要传的参数不懂的话可以一个个查的。

反射虽然是一个很不错的技术,但是不要以为它深不可测,其实真正学起来是很简单的。理解流程以及调用的过程基本上就可以把它拿下了。个人认为此节内容是比较通俗易懂的,

基本上就是这样的模版,设计到一些细节的问题大家可以多多debug下,好多属性和方法可以在debug下很清晰的看到。好的程序员应该有能力在debug下学到更多东西,我就经常在debug下一个一个的观察,例举各种情况来发现不同点和易错点。

  喜欢我的话,就果断关注我吧。附上两份源码:

一:自己写的类库http://files.cnblogs.com/Zeech-Lee/Calculate.rar,二:反射的使用。http://files.cnblogs.com/Zeech-Lee/%E5%8F%8D%E5%B0%84.rar

作者: Zeech_Lee 发表于 2011-10-18 18:11 原文链接

评论: 4 查看评论 发表评论


最新新闻:
· RIM发布BBX移动平台:整合黑莓和QNX系统(2011-10-19 08:29)
· 盛大在线调整收官:新管理层成型 裁员未超5%(2011-10-19 08:28)
· 雅虎第三季度净利润2.93亿美元同比下滑26%(2011-10-19 08:27)
· 苹果员工今天悼念乔布斯 零售店将停业数小时(2011-10-19 08:26)
· 三星苹果专利战全面开打:禁售令申请扩至亚太(2011-10-19 08:25)

编辑推荐:最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用48

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [反射 反射] 推荐:

情景反射陷阱

- 烙饼 - 坏脾气的小肥
情景这个词,很多人称之为场景,都是一个意思. 我喜欢用“情景”,是因为场景的语感更偏重环境描述,而情景则附带有该环境下的直观感受这层意思. 最近一年,我带的几个项目有得有失,大都踩到了同一颗地雷,即“情景反射陷阱”. 这枚生造词的意思是,当用户接触到产品的时候印象尚可,但一旦关闭窗口,就很难想到再回来使用,缺乏刺激用户“再去用那款产品”的条件反射情景.

[翻译]反射的规则

- stern - Some reminiscences, some memories
第一次知道反射的时候还是许多年前在学校里玩 C# 的时候. 那时总是弄不清楚这个复杂的玩意能有什么实际用途……然后发现 Java 有这个,后来发现 PHP 也有了,再后来 Objective-C、Python 什么的也都有……甚至连 Delphi 也有 TRttiContext……反射无处不在. Go 作为一个集大成的现代系统级语言,当然也需要有,必须的.

【反射】教你在十分钟内学会反射

- Xin - 博客园-首页原创精华区
  反射,提供了封装程序集、模块和类型的对象(Type 类型). 可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性. 如果代码中使用了属性,可以利用反射对它们进行访问. 其实反射很简单的,理解了调用的过程再自己动手做几个实例基本上就能熟悉了.   对于反射,我们需要准备好一个类库,编译出DLL文件,然后通过System.Reflection命名空间下的 Assembly类来加载这个程序集:.

【转】java 反射的局限性

- - Java - 编程语言 - ITeye博客
今天公司的JAVA项目碰到一个问题:在生成xls文件的时候,如果数据较多,会出现ArrayIndexOutOfBoundsException. Google发现是项中所用的jxl包(开源库,用以处理xls文件)的一个BUG. 也找到了一个解决办法: http://www.blogjava.net/reeve/archive/2013/01/11/114564.html——即找到它的源代码,修改其中的一个静态常量,然后重新打包成jar即可.

用看不见的玻璃解决屏幕反射问题

- 小天 - Solidot
使用笔记本等电脑,总免不了需要处理屏幕玻璃的反射问题. 然而未来,令人不胜其忧的反光将离我们远去. 日本电气玻璃公司(NEG)在2011年国际平面显示器展上展示了看不见的玻璃面板. NEG所做的只是在玻璃两面覆盖几纳米厚的低反射薄膜层. 典型玻璃片的光反射率是8%,NEG的抗反射技术可以将反射率降低到0.5%.

通过JAVA反射修改JDK1.6*当中DNS缓存内容

- - Taobao QA Team
为了实现性能压测时的域名动态绑定功能,尝试通过java反射修改JDK1.6×当中的DNS缓存,感谢在此过程中林轩同学的大力帮助. 网上也存在着修改DNS缓存的方法,但是都是基于jdk1.5的,无法应用. 另外,大部分都是修改的缓存过期时间,而没有真正去尝试修改dns 的cache内容,所以尝试了很多种方法,并且查看了jdk的源代码,终于实现了修改dns缓存内容和时间,如下,欢迎大家一起探讨.

用看不见的玻璃解决屏幕反射问题

- Deejan - cnBeta.COM
使用笔记本等电脑,总免不了需要处理屏幕玻璃的反射问题. 然而未来,令人不胜其忧的反光将离我们远去. 日本电气玻璃公司(NEG)在2011年国际平面显示器展上展示了看不见的玻璃面板.

Chrome 是怎么过滤反射型 XSS 的呢?

- - 知乎每日精选
首先要说明的是 它是webkit的一个模块,而非chrome,所以Safari和360安全浏览器极速模式等webkit内核的浏览器都有XSS过滤功能. 通过模糊匹配 输入参数(GET query| POST form data| Location fragment ) 与 dom树,如果匹配中的数据中包含跨站脚本则不在输出到上下文DOM树中.另外,匹配的规则跟CSP没有什么关系,最多是有参考,CSP这种规范类的东西更新速度太慢跟不上现实问题的步伐.

一个反射型XSS例子的解析

- - CSDN博客推荐文章
我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回. 如http://localhost:8080/prjWebSec/xss/reflectedXSS.jsp?param=value. 上例中的value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,.

从一起 GC 血案谈到反射原理

- - IT瘾-dev
公司之前有个大内存系统(70G以上)一直使用CMS GC,不过因为该系统对时间很敏感,偶尔会因为gclocker导致remark特别长(虽然加了 -XX:+CMSScavReengeBeforeRemark参数,但是gclocker会导致remark前的YGC被delay),无法忍受这么长的暂停就只好迁移到了G1,经过一系列的调优之后算比较稳定了,这套参数便推到了全部机器上.