反射是一种机制,用于在运行时获取和操作类型的信息。通过反射,可以动态加载程序集,创建对象实例,获取和设置对象的属性值,以及调用对象的方法等,而无需在编译时知道该类型的具体信息。
优点:
动态加载和使用程序集:反射可以在运行时动态加载并使用程序集,实现插件系统或基于配置文件的类型加载。
动态创建对象实例:通过反射可以实现根据动态获取的类型信息创建对象实例,适用于需要在运行时动态创建对象的场景。
访问和调用类型的成员:反射可以通过字符串的方式访问类型的成员,实现通用的对象访问器,方便处理不同类型的对象的操作。
自动生成代码或执行泛型操作:反射可以用于生成代码,或执行在编译时无法确定的泛型操作。
缺点:
性能开销:由于反射涉及到在运行时获取和操作类型的信息,可能会引入一定的性能开销。反射操作的执行效率通常较低,比直接访问成员或调用方法要慢。
编译时检查不可用:反射在编译期间无法进行编译时类型检查,容易造成类型错误。由于反射是动态的,编译器无法对其进行验证,可能导致运行时异常。
使用情况--反射适用于以下情况:
需要动态加载和使用程序集的场景,如插件系统或基于配置文件的类型加载。
需要在运行时根据类型信息动态创建对象实例的场景。
需要通过字符串访问对象的成员,实现通用的对象访问器。
需要生成代码或执行泛型操作的场景。
需要注意的是,在使用反射时应权衡灵活性和性能,并确保使用反射的代码符合预期,避免出现错误和安全问题。
例:(此代码为vb.net)
Private Sub UiLabel1_Click(sender As Object, e As EventArgs) Handles UiLabel1.Click
Dim tbName As String = "str字符串1"
FillTb(tbName)
End Sub
Private Sub UiLabel2_Click(sender As Object, e As EventArgs) Handles UiLabel2.Click
Dim tbName As String = "str字符串2"
FillTb(tbName)
End Sub
Function FillTb(tbName As String) As Boolean
'通过对照获取方法名称
Dim ReflectFunc As String = GetContrastFunc(tbName)
'*代表class文件所在的层次(如有替换即可)
'Type.GetType方法获取"项目名称"命名空间下的 .*.*.func1所在的class类型
Dim t = Type.GetType("项目名称.*.*.func1所在的class")
'使用GetMethod方法获取ReflectFunc参数指定的方法信息
Dim method As MethodInfo = t.GetMethod(ReflectFunc)
If method Is Nothing Then
MsgBox("未找到方法",, "提示")
Return False
End If
'通过method.Invoke方法调用该方法
method.Invoke(Nothing, {})
Return True
End Function
'获取 反射对照函数
Public Shared Function GetContrastFunc(tbName As String) As String
Dim dic1 As New Dictionary(Of String, String) From {
{"str字符串1", "func1"},
{"str字符串2", "func2"}
}
Dim retS As String = ""
If dic1.Keys.Contains(tbName) Then
retS = dic1.Item(tbName)
End If
Return retS
End Function
Public Shared Function func1() As Boolean
‘实际代码
Return True
End Function
Public Shared Function func2() As Boolean
‘实际代码
Return True
End Function