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
{STRING,”sTrans”,reinterpret_cast
{-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
Java单例模式实例—读取配置文件 http://www.linuxidc.com/