QT反射机制的原理和应用及优缺点
QT界面美化QML性能优化QT原理源码QT视频课程
关注
13 人赞同了该文章
ü QT反射是什么?
ü QT反射的原理
ü QT反射的应用
ü QT反射应用实例
ü QT反射不足之处
ü QT反射的优点
ü QT反射是什么?
现在很多程序设计语言都支持反射机制,C++语言本身不支持反射机制,QT框架在语言层面之上实现了反射机制。
那么什么是反射呢?用一句通俗的话来讲就是:
反射提供了某种基础设施,使得程序员能够编写代码查询到某个具体类型的各种类型信息,并且能通过非常规手段创建对象实例和调用对象方法以及读写对象的属性。
ü QT反射的原理
任何具备反射能力的语言或者框架,在运行时并不能凭空获取到类型信息,更不能凭空创建对象和调用对象上的方法,必然是在运行时刻能够从某处内存中获取到所需的类型信息;运行时也不能在内存中某处凭空产生类型信息,必然是在编译该类型时就产生了对应的类型信息并保存到可执行文件中,然后在加载可执行文件时就将该类型信息加载到了内存中。
QT框架基于QT元对象系统实现了QT的反射机制。QT提供反射所需的类型信息由QT元对象系统提供,实际上类型信息也正是储存在元对象系统中,就是所谓的元对象数据(meta-object-data)。这些元对象数据是由QT的元对象编译器(moc,meta-object-compiler)在编译时期产生的。
QT框架的核心原理可参考QT原理与源码分析视频课程:
QT原理与源码分析视频课程
ü QT反射的应用
说了半天的QT反射机制的原理,那么QT反射机制到底有什么用呢?
一般的普通应用程序中,包括QT反射机制在内,几乎各种编程语言的反射机制都没什么实际价值,因为大部分普通应用程序直接遵循C++语法规则来创建对象和调用方法就可以了。
对于软件框架开发者而言,反射机制的价值就大了。比如,想实现在XML配置文件中配置类型名称和方法名称及属性名称,然后在程序运行时软件框架可以自动化的创建出所配置的类型名称对应的类的对象实例,然后还可以在框架中调用对象上的方法,还可以读写对象上的属性。
可能有的朋友会想,软件框架为什么不遵循C++语言规则直接new一个对象实例,然后使用.或->运算符去正常调用对象上的方法呢? 原因可能是软件框架在编译时尚不知道框架的用户会创建哪一个类的对象实例,更不知道会调用哪一个方法,读写哪一个属性。对于软件框架而言,通常是先有框架,然后才会有框架的用户去使用这个框架。对于框架的作者而言,只有使用反射机制才能实现这种功能。这个可能是反射机制的最大的价值所在,也是不可替代的价值所在。QT反射机制自然也是如此。
ü QT反射应用实例
主程序源代码:
框架API接口源代码
框架API接口实现源代码:
具体类型的源代码:
具体类型所在DLL模块必须提供这个导出函数供框架调用。
ü QT反射不足之处
由于QT只是一个软件框架,而不是程序设计语言,因此不能像一些语言层面支持的反射机制那样简洁,比如直接根据类型名称取得类型信息描述对象,也就是类似QT中的元对象数据。QT框架的反射在应用时始终绕不开如何获取到类型的QT元对象数据这个问题。在前面讨论的实例中采取了让具体类型所在DLL模块导出一个C语言函数的做法。
具体类型所在DLL肯定是知道该类型定义的,因此可以轻松实现这个函数。框架可以根据这个函数名称从加载的DLL中取得运行时的函数指针。
当然,也可以直接让导出函数返回框架基础类型ButianyunWorker的指针类型,这样也可实现反射类似的功能。
ü QT反射的优点
如果直接让导出函数返回框架基础类型ButianyunWorker的指针类型,那么每一个具体类型都会受到某种设计约束,或者说附加了一些限制,比如每一个具体类型必须从这个相应的不同的基础类型派生,而且只能重新实现框架基础类型已定义的虚函数,而不能随意定义任何函数。
如果使用了QT反射,则每一个具体类型都不存在这种限制。比如,具体类型甚至无需从框架基础类型派生;另外在实际应用的配置文件中,可以随意指定符合QT反射规则的类名称和方法名称以及参数列表。这一点应该算是QT反射的优点。
仅供参考,欢迎批评指正。
如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。
编辑于 2023-08-08 16:01・IP 属地