前言
Qt可以像JAVA一样实现反射类,使用时直接使用类名就可以创建类。本文反射类的封装,实现与优缺点
一、反射类的封装
//反射类的宏定义
/*****************************************************************************
* @brief : GetReflectionClass 这是一个反射函数 该函数只负责创建,不负责销毁
* @author : anjj
* @date :2021/09/09 14:10
* @version : 1.0
* @inparam : QString strClassName 函数名称
* QObject * parent 父类
*
* @outparam :
* @return :该函数将返回模板T
* 示例CICD_ANALYSIS_BASE * pIcd = GetReflectionClass<CICD_ANALYSIS_BASE>("CICD_CAT021_V0DOT26", this);
*****************************************************************************/
template <class T>
T* GetReflectionClass(QString strClassName, QObject * parent)
{
strClassName += "*";//类名后面必须带指针 * 否则无法找到反射类
int type = QMetaType::type(strClassName.toUtf8());
const QMetaObject *metaObj = QMetaType::metaObjectForType(type);
if (nullptr == metaObj)
{
return nullptr;
}
QObject *obj = metaObj->newInstance(Q_ARG(QObject*, parent));
return qobject_cast<T*>(obj);
}
/*****************************************************************************
* @brief : IMPORT_CLASS_NAME 注册反射类名 宏
* @author : anjj
* @date :2021/09/09 14:13
* @version : 1.0
* @inparam :
*
*
* @outparam :
* @return :
* 示例 int CICD_CAT021_V0DOT26::nTypeId = IMPORT_CLASS_NAME(CICD_CAT021_V0DOT26)
*****************************************************************************/
#define IMPORT_CLASS_NAME(name) qRegisterMetaType<name*>();
二、使用方法
首先需要反射的那个类需要先注册自己的类名
//注册反射函数,使用时根据类名就能创建函数
int CICD_CAT021_V2DOT1::nTypeId = IMPORT_CLASS_NAME(CICD_CAT021_V2DOT1);
类CICD_ANALYSIS_BASE 是类CICD_CAT021_V2DOT1的基类
类 CICD_ANALYSIS_BASE 继承 QObject
使用的时候调用GetReflectionClass + 注册类名就能反射你当时注册的函数了
CICD_ANALYSIS_BASE * pIcd = GetReflectionClass<CICD_ANALYSIS_BASE>("CICD_CAT021_V2DOT1", this);
if (nullptr == pIcd)
{
qDebug()<< QStringLiteral("反射数据类不存在:CICD_CAT021_V2DOT1");
return;
}
三、反射类的优缺点
缺点:速度慢
优点:运行期类型的判断,动态加载类,提高代码灵活度。