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

  • 相关阅读:
    2021.4.4(每周总结)
    2021.4.2
    2021.4.1
    2021.3.31
    2021.3.30
    2021.3.29
    2021.3.28(每周总结)
    2021.3.26
    C语言中指针与取地址符&详解
    使用JDBC连接、操作数据库、实现数据处理
  • 原文地址:https://www.cnblogs.com/JohnTang/p/10914076.html
Copyright © 2020-2023  润新知