如有不足之处,还望多多赐教,万分感谢。
反射概念
反射Reflection::System.Reflection是.Net Framework提供的一个帮助类库,可以读取并使用metadata
metadata:元数据,数据清单,描述了DLL/exe里面的各种信息
反射基本语法:
Assembly assembly = Assembly.Load("程序集名称");//动态加载:
Type type= assembly.GetType("完整类名");//获取类型 完整类型名称:
object _object= Activator.CreateInstance(type);//创建对象
类名 _tempName = _object as 类名;//类型转换,类型不对就返回null
_tempName.方法名();//调用方法
代码示例:
static void Main(string[] args) { //1动态加载程序集 //完整路径: // Assembly assembly = Assembly.Load(@"E:学习笔记StudentUtilWebApplication1Reflection.DB.MySqlinDebugReflection.DB.MySql.dll"); Assembly assembly = Assembly.Load("Reflection.DB.MySql");//当前路径 //2获取类型,类型名称必须是完整的,否则找不到. Type type = assembly.GetType("Reflection.DB.MySql.MySqlHelper"); //遍历出所有的类型、方法甚至是属性和字段等 foreach (var item in assembly.GetTypes()) { Console.WriteLine(item.Name); foreach (var method in item.GetMethods()) { Console.WriteLine(method.Name); } } //3创建对象实例,CreateInstance返回的是object类型所以用object接收 object _object = Activator.CreateInstance(type); //如果正常情况下,此处就应该直接调用方法 //而反射之所以不能直接调用方法是因为编译器不认可 //类型转换 IDBHelper dBHelper = _object as IDBHelper; //调用方法 dBHelper.Query(); }
反射之破坏单例模式
单例模式:
一个类能保证在整个进程中只有一个实例 要求:1.构造函数私有化 2.对外提供一个公开的静态方法,负责提供对象的实例,通过提供一个静态字段,在一个静态构造方法里进行初始化
public sealed class Singleton { private static Singleton _Singleton = null; private Singleton() { Console.WriteLine("Singleton被构造"); } static Singleton() { _Singleton = new Singleton(); } public static Singleton GetInstance() { return _Singleton; } }
///反射破坏单例---就是发射调用私有构造函数
Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");
Type type = assembly.GetType("Ruanmou.DB.SqlServer.Singleton");
Singleton singletonA = (Singleton)Activator.CreateInstance(type, true);
singletonA.Singleton();//私有方法居然被访问到了