关于反射的具体使用

从RADIUS服务器到AP:实战搭建一个小型WPA2-Enterprise测试环境(FreeRADIUS + 家用路由器) 本文详细介绍了如何从零搭建WPA2-Enterprise测试环境,使用FreeRADIUS服务器和家用路由器实现企业级WiFi认证。通过实战指南,包括证书生成、EAP-PEAP配置、OpenWrt路由器设置及故障排查,帮助网络工程师和爱好者掌握802.1X协议栈的实际应用。 阅读详情
 

 

反射的概述: 
         反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。
         System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码   

System.Reflection.Assembly
System.Reflection.MemberInfo
System.Reflection.EventInfo
System.Reflection.FieldInfo
System.Reflection.MethodBase
System.Reflection.ConstructorInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type
以下是上面几个类的使用方法:
(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。
(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。
(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
反射的层次模型:
(注:层次间都是一对多的关系)

反射的作用:
1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型
2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

应用要点:
1、现实应用程序中很少有应用程序需要使用反射类型
2、使用反射动态绑定需要牺牲性能
3、有些元数据信息是不能通过反射获取的
4、某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。

 

反射appDomain 的程序集:

当你需要反射AppDomain 中包含的所有程序集,示例如下:
static void Main
{
      //通过GetAssemblies 调用appDomain的所有程序集
      foreach (Assembly assem in Appdomain.currentDomain.GetAssemblies())
     {
      //反射当前程序集的信息
           reflector.ReflectOnAssembly(assem)
     }
}

说明:调用AppDomain 对象的GetAssemblies 方法 将返回一个由System.Reflection.Assembly元素组成的数组。


反射单个程序集:

上面的方法讲的是反射AppDomain的所有程序集,我们可以显示的调用其中的一个程序集,system.reflecton.assembly 类型提供了下面三种方法:
1、Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上,先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常
2、LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。
3、LoadWithPartialName:永远不要使用这个方法,因为应用程序不能确定再在载入的程序集的版本。该方法的唯一用途是帮助那些在.Net框架的测试环节使用.net 框架提供的某种行为的客户,这个方法将最终被抛弃不用。

注意:system.AppDomain 也提供了一种Load 方法,他和Assembly的静态Load 方法不一样,AppDomain的load 方法是一种实例方法,返回的是一个对程序集的引用,Assembly的静态Load 方发将程序集按值封装发回给发出调用的AppDomain.尽量避免使用AppDomain的load 方法


利用反射获取类型信息:

前面讲完了关于程序集的反射,下面在讲一下反射层次模型中的第三个层次,类型反射
一个简单的利用反射获取类型信息的例子:

using system;
using sytem.reflection;
class reflecting
{
      static void Main(string[]args)
      {
            reflecting reflect=new reflecting();//定义一个新的自身类
            //调用一个reflecting.exe程序集

            assembly myAssembly =assembly.loadfrom(“reflecting.exe”)
            reflect.getreflectioninfo(myAssembly);//获取反射信息
      }

      //定义一个获取反射内容的方法
      void getreflectioninfo(assembly myassembly)
      {
            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;
          }
     }
}
其它几种获取type对象的方法:
1、System.type  参数为字符串类型,该字符串必须指定类型的完整名称(包括其命名空间)
2、System.type 提供了两个实例方法:GetNestedType,GetNestedTypes
3、Syetem.Reflection.Assembly 类型提供的实例方法是:GetType,GetTypes,GetExporedTypes
4、System.Reflection.Moudle 提供了这些实例方法:GetType,GetTypes,FindTypes


设置反射类型的成员:
反射类型的成员就是反射层次模型中最下面的一层数据。我们可以通过type对象的GetMembers 方法取得一个类型的成员。如果我们使用的是不带参数的GetMembers,它只返回该类型的公共定义的静态变量和实例成员,我们也可以通过使用带参数的GetMembers通过参数设置来返回指定的类型成员。具体参数参考msdn 中system.reflection.bindingflags 枚举类型的详细说明。

例如:
//设置需要返回的类型的成员内容
bindingFlags bf=bingdingFlags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.Public;
foreach (MemberInfo mi int t.getmembers(bf))
{
      writeline(mi.membertype)   //输出指定的类型成员
}


通过反射创建类型的实例:

通过反射可以获取程序集的类型,我们就可以根据获得的程序集类型来创建该类型新的实例,这也是前面提到的在运行时创建对象实现晚绑定的功能
我们可以通过下面的几个方法实现:
1、System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msdn
2、System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集
3、System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap
4、System.type的InvokeMember实例方法:这个方法返回一个与传入参数相符的构造函数,并构造该类型。
5、System.reflection.constructinfo 的Invoke实例方法

反射类型的接口:

如果你想要获得一个类型继承的所有接口集合,可以调用Type的FindInterfaces GetInterface或者GetInterfaces。所有这些方法只能返回该类型直接继承的接口,他们不会返回从一个接口继承下来的接口。要想返回接口的基础接口必须再次调用上述方法。


反射的性能:

使用反射来调用类型或者触发方法,或者访问一个字段或者属性时clr 需要做更多的工作:校验参数,检查权限等等,所以速度是非常慢的。所以尽量不要使用反射进行编程,对于打算编写一个动态构造类型(晚绑定)的应用程序,可以采取以下的几种方式进行代替:
1、通过类的继承关系。让该类型从一个编译时可知的基础类型派生出来,在运行时生成该类型的一个实例,将对其的引用放到其基础类型的一个变量中,然后调用该基础类型的虚方法。
2、通过接口实现。在运行时,构建该类型的一个实例,将对其的引用放到其接口类型的一个变量中,然后调用该接口定义的虚方法。
3、通过委托实现。让该类型实现一个方法,其名称和原型都与一个在编译时就已知的委托相符。在运行时先构造该类型的实例,然后在用该方法的对象及名称构造出该委托的实例,接着通过委托调用你想要的方法。这个方法相对与前面两个方法所作的工作要多一些,效率更低一些。

 

如何使用Dify 搭建一个用自然语言查询数据库的 Agent? 这样就会发布完毕。 阅读详情

相关推荐

手把手教你逆向京东搜索接口:H5ST 556位参数生成与V8补环境技巧

本文深入解析了京东搜索接口中关键的H5ST 556位参数生成机制,并提供了详细的逆向实战指南。针对其复杂的反爬虫环境检测,文章重点介绍了通过链式补环境技巧,在Node.js中完整模拟浏览器环境(包括原型链检测和指纹验证)的方法,帮助开发者成功绕过防护并生成有效参数。

weixin_29315091的博客 483

反射的使用(超详细)

可以实例化:getInstance方法使用clazz.newInstance()方法创建该类的实例对象,因此必须保证这个类是可实例化的,即它必须包含一个公共的默认构造函数,否则会抛出InstantiationException异常。接着,使用构造方法创建对象,这里使用了三种不同的构造方法:无参构造方法,带有一个字符串参数的构造方法和带有一个字符串参数和一个整数参数的构造方法。使用Constructor的newInstance方法创建一个User类的对象,传入的参数是一个字符串"醉梦"。

qq_56198113的博客 830

【可信数据空间-部署方案】

此部署架构体现了以下几个核心原则:去中心化: 数据存储和处理完全分布在各个参与者端,运营方只提供核心的协调和信任基础设施。安全边界清晰: 通过VPC、DMZ、防火墙、K8s命名空间等技术,在每个层级都建立了严格的安全边界。高可用与弹性: 所有关键服务均以集群方式部署,避免单点故障,并能根据负载动态伸缩。云原生: 全面采用容器化和Kubernetes编排,简化部署、管理和运维复杂度。合规性: 架构设计天然满足数据驻留要求(数据留在企业本地),并为所有操作提供不可篡改的审计追踪能力。

u014716614的博客 771

反射的基本使用

java反射 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法 反射的使用: A:通过反射获取构造方法并使用 /* 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。 一:通过反射获取无参构造方法访问 二:通过反射获取有参构造方法访问*/ //1.获取字节码文件对象 Class aClass = Class.forName("com.user"); //2.获取所有的公共的构造方法 Constructor[] c

qq_50886606的博客 838

阿里巴巴达摩院人工智能训练师(高级)

阿里巴巴达摩院人工智能训练师(高级)

huang0612123的博客 1万+

AWD线下攻防赛总结

在本地组策略编辑器里面,依次展开计算机配置—>管理模板—>Windows组件—>远程桌面服务—>远程桌面会话主机—>连接—>限制连接的数量。8.Web目录环境查找相关可疑文件:jpg/png/rar,属性、解压。进程线程:netstat / ps -aux/netstat -apt。4.查看/etc/init.d/rc.local中启动服务有无异常。1.不使用默认口令,修改成复杂的,并确保和web环境连接。5.使用脚本开启进程监控、目录监控、流量监控。文件操作监控.exe/御剑文件监控.exe。

XuJL89的博客 630

java回忆录—带你破封装瞧个遍(反射)

今天来看看我们经常能用到的一个知识点,但又不怎么会用的知识点——反射。那我们在什么时候会用到这个知识点呢,以前我们在学习SSH框架的时候都在和反射打交道,还记得我们学习SSH框架的时候一直需要配置文件(当然注解就更简单了),这就是频繁的用到了反射。现在很多开源框架都用到反射机制。还有就是设计模式中的动态代理模式,我们需要在运行的时候才能确定要代理的对象是啥,要代理干什么,这就需要用到反射,在运行期才

minigeek的博客 2946

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 60

c#中的反射机制

反射的概述:反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码System.Reflection.Assembly Syste...

weixin_30247781的博客 471

083、多帧降噪(MFR)与VST算法:低照度场景下的信噪比提升与鬼影抑制

本文深入探讨了多帧降噪(MFR)和VST算法在低照度场景中的应用与优化。作者从实际项目案例出发,指出单帧降噪的局限性,详细分析了MFR的核心原理与工程实现中的关键环节,包括帧对齐、帧选择、融合策略和鬼影抑制等技术要点。文章特别强调VST变换对噪声均匀化的重要性,并分享了实际开发中的调试经验与参数优化技巧,如"三明治"调试法和性能平衡策略。最后指出,优秀的MFR方案需要在信噪比提升、鬼影抑制和纹理保留之间找到场景化的平衡点,建议开发者通过真实场景测试验证算法效果。全文既有理论分析,又包含丰富的实战经验和技术细

zzfmlxs的博客 123

Google Earth Engine(GEE)——将sentinel - 2影像所有波段重采样到10m分辨率 (resample 和 projection的使用)

影像重投影是将一个影像从一个坐标系投影到另一个坐标系的过程。这通常涉及到将像素从一个平面坐标系变换到另一个平面坐标系。这可以用于许多应用中,例如建立数字高程模型(DEM)和地图制图。影像重投影通常需要进行数学计算,包括转换矩阵和插值算法,以确保像素值的准确性和精度。这次我们将对哨兵2好数据中20m分辨率的波段,重采样到10m分辨率中,然后同一参与计算。

此星光明博客 3108

漫反射及具体光源的照明

光照(明暗模型)概述 三维图形的真实感取决于能否成功地模拟明暗效应。明暗模型用以计算可见表面应该显示地亮度和菜色。通常涉及一个明暗模型需要考虑的主要问题是照明特性、表面特性和观察角度。 照明特性 是指可见表面被照明的情况,主要有光源的数目和性质,环境光及阴影效应等。 表面特性 主要是指表面对入射光线的反射、折射或透明的不同情形,还有表面的纹理及颜色等。 观察角度 是指观察景物时观察者相对可见表面所在的位置。 不同明暗模型的区别主要在于模拟方法。 一般来说明暗模型可以分解为三个部分:漫射照明、具体光

lseaJK的博客 6603

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

反射【反射的具体使用】

反射【反射的具体使用】 1、获取类 编写流程: 先写一个Student类,获取Class对象的三种方式: Object ----> getClass(); 任何数据类型(包括基本数据类型),都有一个静态的 class 属性。 通过Class类的静态方法:forName(String className)。 Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取。 /** * 获取Class对象的三种方式 * 1. Object ——> get

qq_48336929的博客 150

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

泛型通过反射获取具体类

首先需要一个定义一个通用的JavaBean         定义一个私有属性类泛型,用来指定具体类 example:(这里做父类) public class BaseDao<T> implements Serializable { private static final long serialVersionUID = 4723300389545055582L; pri...

Giraffe_it的博客 815

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

泛型的具体使用以及反射赋值

泛型的具体使用以及反射赋值。泛型必须要有 不然编译报错。

weixin_36873225的博客 236

安装反射大师具体步骤与使用教程

安装反射大师具体步骤与使用教程 安装Xposed框架 官网下载地址:https://repo.xposed.info/module/de.robv.android.xposed.installer 或者:安装Xposed的apk文件(提取码:kthq) 下载好之后直接拖入模拟器安装即可。然后打开这个App 安装过程会提示需要root权限哦!!!授予就好了! 安装反射大师 反射大师是一个支持一键脱壳的神器,很好用哦! 先下载反射大师 下载地址:https://pan.baidu.com/s/1ALN5n

liuxiaohuai_的博客 1万+

反射的具体使用方法

装瞧个遍(反射) 标签: java 2016-08-09 17:13 384人阅读 评论(2) 收藏 举报 分类: java回忆录(18) 版权声明:本文为博主原创文章,未经博主允许不得转载。 今天来看看我们经常能用到的一个知识点,但又不怎么会用的知识点——反射。那我们在什么时候会用到这个知识点呢,以前我们在学习SSH框

ProfeSir的博客 736

反射与类的具体操作

反射与类之间的操作1. 获取父类信息2. 调用构造方法3. 反射调用普通方法4. 反射调用类中属性5. 总结 1. 获取父类信息 在Class类中提供了一些方法来获取父类信息,以下列举出三个: 获取类的包名称:public Package getPackage() 取得父类的Class对象:public native Class<? super T> getSuperclass()...

mi_zhi_lu的博客 590

Java反射之具体使用

一、反射 反射机制在Java中十分重要,那到底什么是反射机制?举个例子,正常情况下如果已经有一个类,那肯定可以通过类来创建对象;那么如果现在要求通过一个对象来找到一个类的名称,就需要反射机制了。 在反射操作中,一定要把握住一个核心概念:“一切的操作都将使用Object完成,类、数组的引用都可以用Object接收”。 谷歌一下定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所...

qq_21830869的博客 201

反射的使用和具体案例

文章目录1.JAVA反射机制:2.反射中常使用的类Class类:Method类:Feild类:Constructor类:Modifier类:3.具体使用4通过反射重构dao层代码 1.JAVA反射机制: 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息 以及动态调用对象方法的功能称为java语言的反射机制。 2.反射中常使用的类 Class类: 获取Class类的方式: 1.Class clazz = 类名.Cla

qq_42739776的博客 512

反射的具体应用

关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")而不管在哪一层写这段代码其中的("程序集")读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的bin下必须有注意CreateInstance()一定是命名空间.类名,否则创建的实例为空Assembly.Load("程序集名")Assembly.LoadF...

dengyidan4742的博客 107

c++ so 反射_C++反射机制具体实现方法详解

C++编程语言是一款功能强大的计算机应用语言。其能够支持很多程序设计风格。我们今天将会在这里为大家详细介绍一下有关C++反射机制的具体实现步骤,大家可以从中获得一些有帮助的内容。在Java编程中,我们经常要用到反射,通过反射机制实现在配置文件中的灵活配置, 但在C++编程中,对这种方式步提供现有的支持,那么我们怎么才能在配置文件中配置想要调用的对象呢?我们的思路是通过对象名称确定对象实例,把对象名...

weixin_39622332的博客 283

利用反射调用具体的方法

package com.mldn.demo; import java.lang.reflect.Method; /* * 利用反射调用具体的方法 * */ public class Demo02 { public static void main(String[] args) throws Exception { //1.获得指定的class对象 Class&lt;?&gt; c...

渔闻520的博客 577

泛型反射,如何用泛型反射获得当前类泛型的具体类型

有时候我们需要知道当前类所传入的泛型的具体类型而进行下一步操作,这是我们可以使用泛型反射。 1.假如Dao层的接口有很多共同的方法,增删改查,我们可以对他进行提取到一个公共接口IBaseDao&lt;T&gt; package com.sg.xjgc.generic_reflect; import java.util.List; /** * @date on 15:31 2018/12...

qingxixiansheng的博客 3895

反射的具体实现

通过Class类中的静态方法forName();通过getClass()方法;通过.class静态属性;

hdjag的博客 266

JAVA 反射的作用和具体的使用

java 反射 反射十分强大,可以调用知道任何类,方法,属性,反射是框架的灵魂 1.要反射当然要先找到入口有3种方法获得入口 对象.getclass() Parson ps=new Parson(); Class<?> cl= ps.getClass(); Class.forName("包名.类名") Class<?> forName = Class.forName...

weng74的博客 409
上一篇: C#中使用反射的优缺点
下一篇: 观察者设计模式
SpringFiled
博客等级 码龄15年 9粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值