反射1

                                                                      如有不足之处,还望多多赐教,万分感谢。

反射概念

反射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();//私有方法居然被访问到了

原文地址:https://www.cnblogs.com/JohnTang/p/10914076.html