反射学习系列1-反射入门
反射学习系列目录
反射学习系列1-反射入门
反射学习系列2-特性(Attribute)
反射学习系列3-反射实例应用
作者
Reflection,中文翻译为反射。这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
一、Type类于获取类型信息
System.Type 类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个 Type。您可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。
大家运行一下下面的代码根据结果分析一下就能比较清楚的理解Type了
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
MyClass m = new MyClass();
Type type = m.GetType();
Console.WriteLine("类型名:" + type.Name);
Console.WriteLine("类全名:"+type.FullName);
Console.WriteLine("命名空间名:"+type.Namespace);
Console.WriteLine("程序集名:"+type.Assembly);
Console.WriteLine("模块名:"+type.Module);
Console.WriteLine("基类名:"+type.BaseType);
Console.WriteLine("是否类:"+type.IsClass);
Console.WriteLine("类的公共成员:");
MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员
foreach (var item in memberInfos)
{
Console.WriteLine("{0}:{1}",item.MemberType,item);
}
}
}
class MyClass
{
public string m;
public void test()
{ }
public int MyProperty { get; set; }
}
}
二、获取程序集元数据
Assembly类定义了一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。因为程序集中是使用元数据进行自我描述的,所以我们就能通过其元数据得到程序集内部的构成。结合Assembly和反射能够获取程序集的元数据,但是首先要将程序集装入内存中。可以使用Assembly类的多种静态Load方法加载程序集。
下面的程序显示程序集的信息
public static void Main()
{
//获取当前执行代码的程序集
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);
}
}
三、动态加载类型
早绑定是在编译时绑定对象类型,而晚绑定是在运行时才绑定对象的类型。利用反射可以实现晚绑定,即动态加载类型,并调用他们的方法,下边是MSDN中的一个例子,详细的解释信息见注释
namespace ConsoleApplication2
{
public class Example
{
private int factor;
public Example(int f)
{
factor = f;
}
public int SampleMethod(int x)
{
Console.WriteLine("\nExample.SampleMethod({0}) executes.", x);
return x * factor;
}
public static void Main()
{
//获取当前执行代码的程序集
Assembly assem = Assembly.GetExecutingAssembly();
Console.WriteLine("Assembly Full Name:");
Console.WriteLine(assem.FullName);
// The AssemblyName type can be used to parse the full name.
AssemblyName assemName = assem.GetName();
Console.WriteLine("\nName: {0}", assemName.Name);
Console.WriteLine("Version: {0}.{1}",
assemName.Version.Major, assemName.Version.Minor);
Console.WriteLine("\nAssembly CodeBase:");
Console.WriteLine(assem.CodeBase);
// 从程序集众创建一个Example实例并且用object类型的引用o指向它,同时调用一个输入参数的构造函数
Object o = assem.CreateInstance("ConsoleApplication2.Example", false,
BindingFlags.ExactBinding,
null, new Object[] { 2 }, null, null);
//构造Example类的一个晚绑定的方法SampleMethod
MethodInfo m = assem.GetType("ConsoleApplication2.Example").GetMethod("SampleMethod");
//调用刚才实例化好的Example对象o中的SampleMethod方法,传入的参数为42
Object ret = m.Invoke(o, new Object[] { 42 });
Console.WriteLine("SampleMethod returned {0}.", ret);
Console.WriteLine("\nAssembly entry point:");
Console.WriteLine(assem.EntryPoint);
}
}
反射学习系列1-反射入门相关推荐
- 反射学习系列3-反射实例应用
反射学习系列目录 反射学习系列1-反射入门 反射学习系列2-特性(Attribute) 反射学习系列3-反射实例应用 作者 例子这个东西其实挺难弄得,弄个简单的,虽然能说明问题但却容易让人觉得没实用价 ...
- 反射学习系列2-特性(Attribute)
先看一个简单的例子 [Table(Name="dbo.[User]")] public partial class User { 当C#编译器发现这个属性有一个特性Table时,首 ...
- .net Dapper 学习系列(1) ---Dapper入门
目录 写在前面 为什么选择Dapper 在项目中安装Dapper 在项目中使用Dapper 在项目中使用Dapper 进行单表增删改数据操作 总结 写在前面 Dapper 是一款轻量级ORM架构.为解 ...
- Android-音视频学习系列(一)-JNI-从入门到精通,android开发入门
/** 1. 加载 native 库 */ static { System.loadLibrary("native-lib"); } @Override protected voi ...
- 反射学习4-通过反射机制动态创建和访问数组
一.前言 java.lang.reflect.Array类提供了动态创建和访问数组元素的各种静态方法. static Object newInstance(Class<?> comp ...
- Linux学习系列之Linux入门(一)linux安装与入门
第一篇:安装并配置Linux开发环境 一.安装linux: 主要安装Linux的发行版,到目前为之,主要的发行版有: 比较常用的是Ubuntu.redhat和centOS,主要的安装方法详细: Ubu ...
- H5学习系列之webSocket入门
Websocket 1.websocket是什么? WebSocket是为解决客户端与服务端实时通信而产生的技术.其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接, 此 ...
- Java基础与提高干货系列——Java反射机制
前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...
- java反射机制深入详解_Java基础与提高干货系列——Java反射机制
前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...
最新文章
- Linux下怎么诊断网站性能异常
- Json解析不允许子类父类变量重名的原因
- LeetCode N-ary Tree Level Order Traversal(bfs)
- 个人创业做什么好?以下这几个值得考虑
- AndroidStudio中使用XML和Java代码混合控制UI界面实现QQ相册照片列表页面
- C语言*运算符和运算符
- vb 发送html邮件,【VB】邮件发送功能
- 案例 月工作列表 c# 1614192274
- 无任何歧视!任正非:愿意把5G技术授权给一家美国公司
- html框架集frame是啥意思,HTML框架集frameset和内嵌框架iframe
- 如何找回丢失的Applications文件夹
- iOS “项目名” has conflicting provisioning settings.
- nc加载不了java,用友NC系统使用过程中常见问题和解决方法
- 黑莓BlackBerry 模拟器上浏览网页
- Docker容器实现跨宿主机通信
- 互联网运营中的“B端”、“C端”分别指什么?
- 开源的Jshop微信小程序商城源码
- Ant Design select下拉框突然拉长
- 局域网内通过ip获取主机名
- 大数据生态系统组件基础学习
热门文章
- 法国政府正考虑采用开源软件
- 【Java】HBase_thrift/thrift2_使用指南
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
- express 学习记录
- C# 连接 Exchange 发送邮件
- live555+ffmpeg如何提取关键帧(I帧,P帧,B帧)
- 【廖雪峰官方网站/Java教程】泛型
- 机器学习总结(一):线性回归、岭回归、Lasso回归
- 由A* = A^T推导问题
- vue+webapi 实现WebSocket 推送