黑马程序猿——深入理解什么是反射

 ------- Java培训、Android培训、iOS培训、.Net培训 、期待与您交流!  -------

深入理解什么是反射
刚开始接触反射的童鞋往往会惊叹这种神奇的功能,其实反射没有那么高大上,就是由几个特殊的类组成体系而已,下面慢慢道来
1. 什么是反射
.Net的应用程序由都是由程序集组成,程序集又由模块组成,模块又由类型组成。反射是在运行时获取程序集信息,模块信息,类信息的一种技术(这些信息一般称为元数据)。这在本质上与读取磁盘文件没有区别。这次读取的时程序集的文件而已,并把读取到的信息存放在几个特别的类中。
2,相关类的介绍
Assembly类:是用于存储程序集的信息,它提供的方法,还可以动态将程序集加载到内存实例。
Type类:用于存放类型信息,初学的童鞋往往对这个类会感到迷惑,举个例子,他可以存放int类型,有几个方法,几个属性,各自的访问控制信息等;他甚至可以存放自己类型的相关信息
MethodInfo类:在Type类型中,他是使用MethodInfo类来存放相关类型的方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
类似的还有FieldInfo、PropertyInfo、ConstructorInfo、EventInfo等,童鞋看名字也应该代表的含义了吧

3,玩玩反射
(1)获取当前都程序加载了什么程序集(单应用程序域)//应用程序域的概念是另外一个大的主题,感兴趣的童鞋请自己查想关资料。
foreach (Assembly assem in AppDomain.currentDomain.GetAssemblies()) 
{ 。。。} 
调用AppDomain 对象的GetAssemblies 方法 将返回一个由System.Reflection.Assembly元素组成的数组。 

(2)获取类型信息(这个厉害哦,不用new,手动输入任意类型的名字,就可以实例化相应的类型,这也是大多童鞋对反射惊叹的原因,其实这只是反射技术的一个很小的应用而已)

class Project

static void Main(string[]args) 

Project rf=new Project();
assembly myAssembly =assembly.loadfrom(“rf.exe”) //可以动态加载程序集哦。
Project.getreflectioninfo(myAssembly);

void getreflectioninfo(assembly myassembly) //懂点E问的小盆友都应该明白什么意思,我就不注释了哈

type[] typearr=myassemby.Gettypes();
foreach (type type in typearr)


constructorinfo[] myconstructors=type.GetConstructors;
fieldinfo[] myfields=type.GetFiedls() 
MethodInfo myMethodInfo=type.GetMethods(); 
propertyInfo[] myproperties=type.GetProperties 
EventInfo[] Myevents=type.GetEvents; 
       } 
}

}  

using System;
using System.Reflection;

namespace Console

 {

        class LO

       {

                public int field1;
                private string _name;
                public LO() {}
                public string Name {
               get { return _name; }
               set { _name=value; }
        }
        public int GetInt(int a) {return a;}

        public void Display(string str) 

        {

                       Console.WriteLine(str);
        }
 }

class Class1

 {

        static void Main(string[] args)

 {

                Love love = new Love();
               Type type = love.GetType();

                Object obj = type.InvokeMember

                (

                             null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args

                );

                type.InvokeMember("Display",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance , null , obj , new object[]{"aldfjdlf"});
                int i = (int)type.InvokeMember("GetInt",BindingFlags.InvokeMethod | BindingFlags.Public |BindingFlags.Instance,null,obj,new object[]{1});
               Console.WriteLine(i);
                type.InvokeMember("Name",BindingFlags.SetProperty,null,obj,new string[]{"abc"});
                string str=(string)type.InvokeMember("Name",BindingFlags.GetProperty,null,obj,null);
               Console.WriteLine(str);
               type.InvokeMember("field1",BindingFlags.SetField,null,obj,new object[]{444});
               int f=(int)type.InvokeMember("field1",BindingFlags.GetField,null,obj,null);
               Console.WriteLine(f);
               Console.ReadLine();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案例资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值