定义
反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。Go语言圣经中是这样定义反射的:Go 语言提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法,但是在编译时并不知道这些变量的具体类型,这称为反射机制。
实现与调用
(1)编译时为每个类生成一个全局数据,这个全局数据为Type(以C#为例)类型,里面存放类的描述信息,包括方法描述和属性描述。
(2)Type通过 MethodInfo 和 FieldInfo 描述类的方法和属性。
(3)通过Type实例化一个对象出来,根据属性名和方法名访问属性和调用方法。
代码调用
var t = instance.GetType();
Object obj = Activator.CreateInstance(t);
MethodInfo methodInfo = t.GetMethod(methodName);
methodInfo.Invoke(obj, object[] parameter);
FieldInfo fieldInfo = t.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
/*
BindingFlags.Public|BindingFlags.Instance 默认查找public、instance内容。
BindingFlags.NonPublic|BindingFlags.Instance 查找nonpublic、instance内容
BindingFlags.Instance和BindingFlags.Static二者必须有一项或者都有。如果访问实例,就选instance,反之选static。
*/
fieldInfo.SetValue(obj, object value);