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

2014-11-24 02:31:51 · 作者: · 浏览: 2

在使用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(pFunc4INT32)},


{STRING,"sTrans",reinterpret_cast(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的反射功能。


推荐阅读