反射机制

详解C#中的反射

你离开我真会死。 提交于 2019-12-10 13:51:54
反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1、B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况。这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^)。 2、地球内部结构:地球的内部结构大体可以分为三层:地壳、地幔和地核。地壳是固体,地核是液体,地幔则是半液半固的结构(中学地理的内容,大家还记得吧?)。如何在地球表面不用深入地球内部就知道其内部的构造呢?对,向地球发射“地震波”,“地震波”分两种一种是“横波”,另一种是“纵波”。“横波”只能穿透固体,而“纵波”既可穿透固体又可以穿透液体。通过在地面对纵波和横波的反回情况,我们就可以大体断定地球内部的构造了。 大家注意到这两个例子的共同特点,就是从一个对象的外部去了解对象内部的构造,而且都是利用了波的反射功能。在.NET中的反射也可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中的反射还可以运态创建出对象并执行它其中的方法。 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构

Go语言基础之反射

南笙酒味 提交于 2019-12-09 19:08:28
变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息。 值信息:程序运行过程中可动态变化的。 反射介绍 反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 Go程序在运行期使用reflect包访问程序的反射信息。 在上一篇博客中我们介绍了空接口。 空接口可以存储任意类型的变量,那我们如何知道这个空接口保存的数据是什么呢? 反射就是在运行时动态的获取一个变量的类型信息和值信息。 reflect包 在Go语言的反射机制中,任何接口值都由是 一个具体类型 和 具体类型的值 两部分组成的(我们在上一篇接口的博客中有介绍相关概念)。 在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由 reflect.Type 和 reflect.Value 两部分组成,并且reflect包提供了 reflect.TypeOf 和 reflect.ValueOf 两个函数来获取任意对象的Value和Type。 TypeOf 在Go语言中,使用

反射机制

与世无争的帅哥 提交于 2019-12-09 15:43:58
允许从类名字符串创建对象 JDBC驱动中的Class.forName(驱动类型名)就是一个最常见的例子 允许选择对象的构造函数创建对象 允许通过方法的字符串名称以及参数类型调用方法 允许通过属性的字符串名称存取属性的值 反射机制的使用 通过对前一阶段多种不同的语句类型的解码,可以发现一定规律: 对于简单语句(parametric sentences),都是将语句分段之后,按照每段的不同类型进行解析,解析之后,保存属性值 对于封装语句(encapsulation sentences) 将语句分段,提取各个段的内容 等待多语句组完成或超时未完成时,将有效载荷部分解码为比特数组 将比特数组按照每个属性需要的比特位数以及不同的数据类型将比特数组编码为需要的类型 设置属性的值 编码部分的工作同样存在类似的规律 一些额外需要考虑的问题 属性必须保证顺序 有些属性是必须有的,如果语句中不存在,需要终止解码 有些语句中,有多组信息,例如GSV:http://www.gpsinformation.org/dale/nmea.htm#GSV Annotation Java支持对类(接口)、方法、属性加上annotation 每个annotation可以定义自己的属性,例如序列号、属性是否必须存在等等 因此可以通过annotation,将数据对象的属性进行标注 在解码时,获取需要的属性

ATL3.0中的窗口类-客户端使用ATL创建DUI框架的起点

泪湿孤枕 提交于 2019-12-07 11:15:01
摘要:讨论Active Template Library (ATL) 3.0中的一些类,这些类围绕着Windows API建立了一个面向对象的编程框架,使用这个框架,可以简化Microsoft® Windows®编程并且只需要很少的系统开销。内容包括:考察对窗口做了简单封装的CWindow类;使用CWindowImpl进行消息处理和消息映射;使用ATL中的对话框类以及扩展现有窗口类的功能的方法。 内容: 简介 CWindow CWindowImpl 一个简单而完整的示例 消息映射 为现有的窗口类添加功能 基类消息链 窗口的超类化 窗口子类化 被包含的窗口 消息反射 ATL中的对话框类 指定窗口类的信息 结论 简介: 虽然Active Template Library (ATL)主要是为了支持COM开发而设计的,但它确实包含了很多可用于窗口设计的类。这些窗口类和ATL中的其它类一样,都是基于模版的,并且只需要花费很少系统开销。这篇文章就向我们演示了使用ATL创建窗口和对话框并进行消息处理的基本方法。 这篇文章假设读者熟悉C++语言和Windows程序设计;但是并不一定要求读者具有COM方面的知识。 CWindow: 在ATL窗口类中,CWindow是最基本的。这个类对Windows API进行了面向对象的包装,它封装了一个窗口句柄,并提供一些成员函数来操作它

26.反射及面向对象进阶

我的梦境 提交于 2019-12-06 14:20:21
原文: https://www.cnblogs.com/linhaifeng/articles/6204014.html 一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo) 二 反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) hasattr(object,name)

JAVA_反射

拜拜、爱过 提交于 2019-12-06 12:55:51
概述 定义 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 用途 在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。 反射机制的相关类 与Java反射相关的类如下: 类名 用途 Class类 代表类的实体,在运行的Java应用程序中表示类和接口 Field类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor类 代表类的构造方法 Class类 Class代表类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法,这里对他们简单的分类介绍。 获得类相关的方法 方法 用途 asSubclass(Class clazz) 把传递的类的对象转换成代表其子类的对象 Cast 把对象转换成代表类或是接口的对象

Qt元对象(Meta-Object)系统与反射

淺唱寂寞╮ 提交于 2019-12-06 12:51:57
反射 -在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 要注意术语“反射”和“内省”(type introspection)的关系。内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测;反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构。 C++的反射 C++的标准语法是不提供反射的特性的,不过随着C++17的定稿,估计这个关键词不会加到标准中了。不过这个我们可以用template来实现,这次就不写template了。今天主要是讲的是Qt。 Qt的反射 Qt最大的特点就是增加了moc的过程,个人理解,Qt扩展了C++的语法,以及增强了自己的基本库。 Meta Object System is a part of Qt framework core provided to support Qt extensions to C++ like signals/slots for inter-object communication, run-time type information, and the dynamic property system.[1] Architecture

go 反射

亡梦爱人 提交于 2019-12-06 11:16:41
转载自: https://www.liwenzhou.com/posts/Go/13_reflect/ 本文介绍了Go语言反射的意义和基本使用。 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息。 值信息:程序运行过程中可动态变化的。 反射介绍 反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 Go程序在运行期使用reflect包访问程序的反射信息。 在上一篇博客中我们介绍了空接口。 空接口可以存储任意类型的变量,那我们如何知道这个空接口保存的数据是什么呢? 反射就是在运行时动态的获取一个变量的类型信息和值信息。 reflect包 在Go语言的反射机制中,任何接口值都由是 一个具体类型 和 具体类型的值 两部分组成的(我们在上一篇接口的博客中有介绍相关概念)。 在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由 reflect.Type 和 reflect.Value 两部分组成,并且reflect包提供了

python系列四反射机制

安稳与你 提交于 2019-12-06 10:52:26
反射机制原理: 1.根据字符串的形式导入模块。2.根据字符串的形式去对象(某个模块)中操作其成员 实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块,并通过 hasattr和getattr 检查并获取函数返回值。练习一: #通过用户输入的形式, 导入模块 inp = input('请输入需要导入的模块名:') #__import__用于以字符串的形式导入模块 dd = __import__(inp) #在模块寻找函数并执行函数 inp_func = input('请输入需要执行的函数:') #getattr()用于以字符串的形式去某个模块中寻找函数 tager_func = getattr(dd, inp_func) #在获取到的函数名后加()表示执行函数 result = tager_func() print(result) 练习二: 1).创建文件common.py def login(): return 'login' def logout(): return 'logout' def nb(): return '很牛逼的网页' 2.创建文件test.py import common inp = input('请输入模拟的url路径:') url_inp = inp.split('/')[-1] if hasattr(common, url

C++实现反射机制

自古美人都是妖i 提交于 2019-12-06 10:52:23
C++中反射机制的实现 简单理解:只根据类的名字(字符串)创建类的实例。 事实:C++并没有直接从语言上提供反射机制给我们用,不过无所不能的C++可以通过一些trick来实现反射。 好处:代码精简,提高易用性 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 #include <iostream> #include <map> #include <memory> #include <functional> using FUNC = std::function< void *( void )>; using namespace std; class Reflector { private : map<std::string, FUNC>    objectMap; static shared_ptr<Reflector>  ptr; public : void *CreateObject( const string &str) { for ( auto &x : objectMap) { if (x.first ==