zoukankan      html  css  js  c++  java
  • 反射

    在学习反射之前,先了解一下什么是程序集

    net中的dll与exe文件都是程序集(区别,exe可执行,dll不可以)

    程序集包含资源文件,类型元数据(也就是说属性、字段、参数、函数等)、IL代码,每个称袭击都有自己的名称、版本等信息

    不添加引用时获取程序集的数据

    反射就是动态获取程序集的元数据

    命名空间

    System.Reflection

    dll文件

    namespace ReflectionTest
    {
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public char Gender { get; set; }
    
            public virtual void Say()
            {
                Console.WriteLine("我是一个人");
            }
        }
        class Teacher:Person
        {
            public override void Say()
            {
                Console.WriteLine("我是一名老师");
            }
        }
        class Student : Person
        {
            public override void Say()
            {
                Console.WriteLine("我是一名学生");
            }
        }
    }

    方法

    GetExportedTypes()  获取程序集中定义的公共类型

    //AppDomain.CurrentDomain.BaseDirectory获取当前程序集目录,拼接上dll文件名
                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ReflectionTest.dll");
                //加载程序集
                Assembly ass = Assembly.LoadFile(path);
                //获取程序集中定义的公共类型
                Type[] types = ass.GetExportedTypes();
                foreach (Type item in types)
                {
                    Console.WriteLine(item.Name);
                    Console.WriteLine(item.FullName);
                    Console.WriteLine(item.Namespace);
                }

    GetTypes()  获取程序集定义的类型

     //获取程序集定义的类型,包括internal类型,Teacher和Student类都没显示写访问修饰符
                Type[] types = ass.GetTypes();
                foreach (Type item in types)
                {
                    Console.WriteLine(item.Name);
                    Console.WriteLine(item.FullName);
                    Console.WriteLine(item.Namespace);
                }

    GetType()    获取程序集指定名称的System.Type对象

    //获取程序集指定名称的System.Type对象
                Type t = ass.GetType("ReflectionTest.Student");
                Console.WriteLine(t.Name);

    动态创建对象实例

    CreateInstance() 

    //调用的是无参构造函数,所以当没有无参构造时,就会出错
                object obj = ass.CreateInstance("ReflectionTest.Student");
                Console.WriteLine(obj.GetType());

    Activator.CreateInstace()  传参数(解决上面CreateInstance的问题)

    Type t = ass.GetType("ReflectionTest.Student");
                object obj = Activator.CreateInstance(t,"张三",18,'');
                Console.WriteLine(obj.GetType());

    获取属性方法(包括父类的)

     //获取类属性
                PropertyInfo[] proInfo = obj.GetType().GetProperties();
                foreach (PropertyInfo item in proInfo)
                {
                    Console.WriteLine(item.Name);
                }
                //获取类方法
                MethodInfo[] mInfo = obj.GetType().GetMethods();
                foreach (MethodInfo item in mInfo)
                {
                    Console.WriteLine(item.Name);
                }

    方法调用

    obj.GetType().GetMethod("Say").Invoke(obj, null);

     常用方法

    bool IsAssignableFrom(Type c)  判断当前的类型变量是不是可以接收c类型变量的赋值

    bool IsInstanceOfType(object obj)  判断对象obj是否是当前类的实例(当前类可以是obj的类、父类、接口)

    bool IsSubclassOf(Type c)  判断当前类是否是类c的子类(不包含接口)

    bool IsAbstact  判断是否是抽象类

  • 相关阅读:
    sdk 今日头条_字节跳动又一Android开源力作!全新视频动画特效SDK
    Android播放透明视频(转载)
    git remote: warning: suboptimal pack
    'gitclone报错fatal:protocolerror:badpackheader'
    解决 Maven 无法下载 fastdfs-client-java 依赖。
    教我兄弟学Android逆向12 编写xposed模块
    教我兄弟学Android逆向11 动态调试init_array
    CommunicationsException
    使用css给table表格表头添加斜线(斜线表格)
    [SAA + SAP] 28. Monitoring
  • 原文地址:https://www.cnblogs.com/xiaonangua/p/7340734.html
Copyright © 2011-2022 走看看