Delphi2010强化的反射

2023-12-09 22:33
文章标签 反射 强化 delphi2010

本文主要是介绍Delphi2010强化的反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

很多人可能都发现了,Delphi2010编译后的程序体积非常大,一个空的窗体居然达到接近800K。这些多出来的体积其实就是运行时信息,使用这些信息,我们可以轻松的获取到有关的类内容,并在不知情的情况下使用它们。这个特性对于实现多层的架构有着非同一般的意义。
Delphi2010提供了一个Rtti单元,用于实现运行时信息的Get, Set。
在其中能找到一个名为TRttiContext的Record,它就是本文的主角了。TRttiContext提供了一个静态的构造方法,也就是说,我们无需手工的创建它。新建一个窗体,然后在public下写入 Ref: TRttiContext; 即可完成声明,以后就能直接使用了。(此处的Ref可以按需求修改成任何的合法变量名)
在此我写了一个类,用来做测试,如下(Delphi2010已不再要求用{$MethodInfo}来标识用于反射的信息)

接着就是用代码来获取类的信息了,我在窗体上放了一个TMemo并命名为mm,用于输出信息。
如下:

这是一个很通用的方法,对于任意的类都能调用这个方法来显示它的有关信息。
在窗体的Create事件中,再写一点调用的代码:

到此为止我们先运行一下程序,看看效果,如图所示,TTestClass的信息已经全部输出了。
有人可能会问,为什么只写了两个方法,反射却得到那么多方法呢?那是因为反射机制会同时得到父类的内容。

注意到什么了吗?那三个Field,代码中是private下的,居然拿到了!而同在private下的GetXY()方法却没有得到。暂时还无法确定是否反射单元的bug,或是原本就如此设计。总之现在,我们该拿到的东西都拿到了,不该拿到的也有一部分拿到了。
好了,上面的部分只是“显示”出一个类的信息,对于反射机制来说,只是显示是完全不够的,还要能够调用。很幸运的是,Delphi2010不仅在获取上做了改进,而且调用也方便了很多。
以下的代码是调用TTestClass内的DoAdd()方法:

再来一个给成员变量赋值的代码:

是不是觉得反射用起来很方便呢?不仅仅是类,Record, Set, 有序类型和一些其他的东西在Delphi2010下也都拥有运行时信息,可以被动态获取到。官方提供了一个名为rtti_browser的演示程序,随Delphi2010分发给了最终用户,有兴趣也可以参考一下。

这篇关于Delphi2010强化的反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/475302

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

【反射知识点详解】

Java中的反射(Reflection)是一个非常强大的机制,它允许程序在运行时检查或修改类的行为。这种能力主要通过java.lang.reflect包中的类和接口来实现。 通过反射,Java程序可以动态地创建对象、调用方法、访问字段,以及获取类的各种信息(如构造器、方法、字段等)。 反射的用途 反射主要用于以下几种情况: 动态创建对象:通过类的Class对象动态地创建其实例。访问类的字段