反射是获得运行时类型的方式。
概念这里讨论两个问题。
那么我们具体能够获得什么呢?
1.Assembly类可以获得正在运行的装配件,也可以动态的加载装配件,以及在装配件中查找类型,并创建该类型的实例。机房收费系统的时候看到的一个名字就是命名空间(NameSpace)。在.NET的应用程序中并没有提到这个概念,所以在这里解释一下这个名词。
装配件和命名空间的关系不是一一对应,也不互相包含,其实他们是一种多对多的关系;一个装配件里面可以有多个命名空间,一个命名空间也可以在多个装配件中存在。
命名空间只是说明一个类型是那个族的,比如有人是汉族、有人是回族;而装配件表明一个类型住在哪里,比如有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,这是不矛盾的。
装配件是一个类型位置(居住的地方),那么在一个程序中要使用一个类,就必须告诉编译器这个类住在哪儿,编译器才能找到它,也就是说必须引用该装配件。
那么如果在编写程序的时候,也许不确定这个类在哪里,仅仅只是知道它的名称,就不能使用了吗?答案是可以,这就是反射了,就是在程序运行的时候提供该类型的地址,而去找到它。所以我们就不难理解其实我们应用程序在编译的时候并不需要,那么在应用程序的组成部分中也没有这个概念了。
演示一个反射来动态创建对象了动态调用方法的例子
1.创建如图的界面
2.添加引用
Imports System.Reflection '添加发射的引用 Imports System.Text
Imports System.Reflection '添加发射的引用 Imports System.Text Public Class Form1 '反射来动态创建对象 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim asm As Assembly = Assembly.Load("Net反射机制") '使用程序集来查找 Dim _t As Type() = asm.GetTypes '存放程序集中定义的类型 Dim _type As Type For Each _type In _t '遍历程序集中全部的类型 If _type.Name = "ROBJ" Then '如果查询到的类型是ROBJ Dim p As Integer = 811221 Dim obj As Object = System.Activator.CreateInstance(_type, p) '创建程序集中ROBJ类型的对象 Me.TextBox1.Text = obj.MyResult() '对象的属性(存储程序集的名字) End If Next End Sub '反射来动动态调用方法 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Dim asm As Assembly = Assembly.Load("Net反射机制") '使用程序集来查找 Dim _t As Type() = asm.GetTypes '存放程序集中定义的类型 Dim _type As Type For Each _type In _t '遍历程序集中全部的类型 If _type.Name = "ROBJ" Then '如果查询到的类型是ROBJ Dim p As Integer = 811221 Dim obj As Object = System.Activator.CreateInstance(_type, p) '创建程序集中ROBJ类型的对象 Dim m As MethodInfo = _type.GetMethod("Add") '获得公共方法 Dim result As Integer = m.Invoke(obj, New Object() {1, 33}) '调用当前对象所表示的方法 Me.TextBox1.Text = result '显示方法 End If Next End Sub End Class
'项目中添加一个类(用来发射它) Public Class ROBJ Private result As Integer = 0 '创建私有变量 '创建构造函数-为result赋值 Public Sub New(ByVal _set As Integer) result = _set End Sub '创建一个添加函数:做了一个简单的加减法 Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer Return x + y End Function '设置一个结果属性,目的是存储程序集的名字 Public Property MyResult As Integer Get Return result End Get Set(ByVal value As Integer) result = value End Set End Property End Class