C++实现类似Java反射的基本功能

Linux大全评论1.1K views阅读模式

在使用C++的时候,有时想通过输入的成员名字得到相应取值的功能,也就是想实现类似Java语言自备的反射功能。下面是我自己想到的一个比较方便的实现,仅作记录。

首先实现一个自动代码生成器:

将中间语言转化为C++语言,如下为中间语言可能的定义:

Class CInterLangTrans {

    int32 i32Trans;

    String sTrans;

}

 

编译之后产生的代码:

Class CInterLangTrans {

private:

      int iMemberNum = 2;

      int m_i32Trans;

      string m_sTrans;

 

 

      /*

 *  如下为可能的类型定义:

        *      typedef void (* FuncPtr)(void*, const void*);

        *      Struct CTypeMemberInfo {

        *            int m_i32MemberType;

        *            char* m_szMemberName;

        *            FuncPtr m_funcPtr;

        *        };

      */

      CTypeMemberInfo cTypeMemberInfo[3] = {

              {INT32,"i32Trans",reinterpret_cast<FuncPtr>(pFunc4INT32)},

              {STRING,"sTrans",reinterpret_cast<FuncPtr>(pFunc4STRING)},

              {-1,0}

      };

 

public:

      void getAddressTable(const void* pTable[iMemberNum])

      {

                    int i = 0;

                    pTable[i++] = &m_i32Trans;

                    pTable[i++] = &m_sTrans;

      }

 

      //由成员名字返回成员结构指针

      //实现省略

      CTypeMemberInfo* getTypeMemberInfo(string sMemberName);

 

}

 

//具体使用

//如下pInfo,pField取值步骤省略

 

CTypeMemberInfo* pInfo;

char* pField;

//如下模拟取得相应成员i32Trans的值

int pData;

(*pInfo->m_funcPtr)(&pData, pField);

好了,只是一个简单的想法,通过代码生成器完成大部分的工作,这样应该是可以支持类似JAVA的反射功能。

推荐阅读

Java类类型的存储特点 http://www.linuxidc.com/Linux/2013-10/91073.htm

Java中两种单例模式小结 http://www.linuxidc.com/Linux/2013-05/84751.htm

单例模式(Singleton Pattern) http://www.linuxidc.com/Linux/2012-09/70555.htm

企鹅博客
  • 本文由 发表于 2020年9月2日 03:25:33
  • 转载请务必保留本文链接:https://www.qieseo.com/178848.html

发表评论