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

    技术2022-05-19  21

    在使用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的反射功能。


    最新回复(0)