反射

原创 2016年08月31日 10:12:23

反射

 reflection,动态获取类的信息以及动态调用一个对象的方法的机制叫做反射。
功能优点
 在运行时判断任意一个对象所属的类;
 在运行时判断一个类所具有的属性和方法;
 在运行时构造一个类的对象;
 在运行时调用一个对象的方法;

实现过程
 加载一个类;
 根据这个类动态创建一个对象;
 动态得到这个对象的方法;
 调用这个对象的方法;


反射 - C#

命名空间:using System.Reflection;
1. 元数据
 metedata,有关程序及其类型的数据信息,描述数据(类型)的数据,保存在程序的程序集中。

2. Type 类
 抽象类,命名空间 using System; 用于包含类型的特性信息、访问元数据的主要方式。运行时,CLR 创建 Type 类的子类的实例,但是 CLR 返回 Type 类的引用(指向子类的实例)。程序中的每一个类型都会对应一个独立的 Type 类的对象,用于反射数据。
· 属性方法
- NameSpace/Name:命名空间/类型名
- FullName:类型的完全限定名
- BaseType:直接基本类型
- GetField/GetFields():字段列表
- GetProperty/GetProperties():属性列表
- GetMethod/GetMethods():方法列表
· 类型获取的几种方法:
- typeof 运算符:typeof(类型名);
- 对象调用 GetType() 方法:obj.GetType();
- Type 类的静态方法 GetType():Type.GetType("类型名");

3. 特性
 Attribute,允许向程序的程序集中添加元数据的机制。描述数据的元数据。
ζ Attribute 类在 编译 时实例化;
ζ 所有特性名称以 "Attribute" 结束,在代码中使用特性时,不需指定 Attribute 后缀;
ζ 应用了特性的元素叫做目标 (target);
ζ 参数:位置参数 (必须) Positional Parameters,命名参数 (可选) Named Parameters;
特性的目的是允许编译器把程序结构的某些元数据嵌入到程序集中。从 .Net 角度看,特性是类,继承于 System.Attribute 类再之 System.Object类,对程序中的类、方法、字段、属性等 元素 进行标注和描述,主要用在反射中。具体:
Obsolete:将元素标记为过期的、不再使用的并且在代码编译时显示警告信息。
Conditional:条件编译作用,以编译符号是否定义决定是否包括某个特定方法的所有调用。
Serializable:声明元素可以被序列化。
也可显式标注特性,将其应用到特定元素:程序集assembly、模块module、方法、返回值等。特性 Serializable、AttributeUsage 和 ComVisible 可以用于描述特性,是 "元数据的元数据" (元元数据:meta-metadata)。
自定义特性
· 任何公共的读写字段或属性都是命名参数,构造函数中的参数是特性中的位置参数;
· AttributeUsage 描述特性的使用方式,AttributeTargets 指定特性应用到哪些元素;
· 普通类的构造函数是命令式语句,特性的构造函数是声明式语句;

[AttributeUsage(AttributeTargets.Xxx|AttributeTargets.Xxx, AllowMultiple=true, Inherited=false)]
public sealed class MyAttAttribute : System.Attribute {
   // 字段 属性 构造函数(可重载)
}

利用反射访问特性
· IsDefined()
   利用 Type 对象的 IsDefined 方法检测某个特性是否应用到了某个类上。
   bool isDefined = objType.IsDefined(typeof(MyAttAttribute), false);
· GetCustomAttributes()
   返回应用到结构的特性的数组。返回类型为 object,使用时需要强制转换。
   object[] attArr = objType.GetCustomAttributes(false);

public abstract bool IsDefined(Type attributeType, bool inherit);
public abstract object[] GetCustomAttributes(bool inherit);
public abstract object[] GetCustomAttributes(Type attributeType, bool inherit);

 
4. 反射

参考
[1]. C#反射系列 - 张子阳
[2]. C#特性详解


反射 - Java

参考
[1].


参考
· 反射 - C# 和 Java

版权声明:未经宝宝允许不得转载哦,么么哒。

java 反射详解通俗易懂

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。  那么什么是Java的反射呢?        大家都知道,要...
  • MissWwg
  • MissWwg
  • 2016年06月13日 18:33
  • 19765

Android 反射Method应用

本人喜欢把复杂的事情简单化,简单的事情复杂化---以前读书的时候,语文老师经常再三强调,写作文的时候不要把题目写”太大”了;只要写一件小事,写的越详细越动人就达到了目的! ---zhibao.liu...
  • qq_31726827
  • qq_31726827
  • 2015年12月08日 19:38
  • 1396

反射技术在android中的应用

动态语言:一般认为在程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管这样,JAVA有着一...
  • tiefeng0606
  • tiefeng0606
  • 2016年06月30日 13:53
  • 9760

反射与序列化

  对于反射与序列化 是比较深入的知识 一般编程中都不需要使用到 尤其是反射 然而对需要用到的人来说 这是一个非常有帮助的功能.在此我简介一下反射与序列化 我没有使用MSDN中的术语或者说是正规的解释...
  • smallfishff
  • smallfishff
  • 2007年05月23日 11:51
  • 4686

Java反射得到属性的值和设置属性的值

package com.whbs.bean; public class UserBean { private Integer id; private int age; ...
  • restraint
  • restraint
  • 2014年01月07日 08:41
  • 99030

反射,反射--程序员的快乐?

前几天帮助一位网友解决了一个问题,大概是他们公司的老板做了一个项目,听他的描述项目不是很大,但是他们老板想要做到程序的解耦,也就是说他们封装了一个dll文件,在上层调用时不提供给他们引用关系,对外的设...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年02月20日 12:12
  • 4689

使用线程池和反射实现异步任务

反射,线程池,异步返回
  • Willon_tom
  • Willon_tom
  • 2016年09月22日 10:34
  • 335

scala 奇淫巧技 - 4.反射 对class/object反射

scala 反射 反射调用私有函数 静态函数
  • feloxx
  • feloxx
  • 2017年07月24日 18:00
  • 1493

C#反射实例

http://blog.csdn.net/bdstjk C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从...
  • bdstjk
  • bdstjk
  • 2012年05月04日 16:27
  • 9461

unity5的反射探头

在unity5以前的版本中,当物体的镜面反射程度较高时,为了模拟这种反射效果,我们会用和周围环境差不多cubemap贴图来实现,但也仅仅是差不多而已~只是光栅化时在片段着色器中将该贴图与原纹理混合,这...
  • Ymiku
  • Ymiku
  • 2015年05月15日 17:17
  • 3631
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射
举报原因:
原因补充:

(最多只允许输入30个字)