1.反射机制
反射机制在java中是一个非常重要的特性,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。C++本身是不支持反射机制的。
2.研究背景
由于工作中经常使用到通过if...else...来进行判断走到哪个函数内,会在代码中也一大堆的if...else...非常难看,而且不好维护,因此就想能不能试着实现一下JAVA的反射机制。
一开始想到用函数指针,通过map来保存映射关系,写一个工厂模式的类。用过字符串也就是函数名来进行注册,之后这个工厂可以根据函数名来找不同的函数。
后来无意间发现QT本身就有实现过反射机制,因此决定直接使用QT的反射机制来完成。
3.具体实现
首先要实现QT的反射机制,必须这个类是继承自QObject的类,因为QT在QObject中做了很多封装,使C++能够像JAVA一样写。
其次要在该类中需要做反射的那个函数前写一个宏Q_INVOKABLE,用于声明。
具体例子如下所示:
class Test: public QObject
{
Q_OBJECT
public:
Test();
~Test();
Q_INVOKABLE void func1();
};
在使用的时候也非常的方便,使用QMetaObject::invokeMethod方法即可。具体例子如下所示:
void main(int argc, char *argv)
{
QCoreApplication app(argc, argv);
Test test;
QMetaObject::invokeMethod(&test, "func1");
app.exec();
}
这样就可以调用到func1()的方法了。
4.其他操作
有些函数需要使用返回值,入参出参等,以及多线程异步操作等。可以参看QT的帮助手册。