- 基础版:只实现了通过对象的类名,获取到成员属性的name和type
#include <string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;
#define REFLECT_ATTR(type,name) ReflectManager __##name = ReflectManager(this,#type,#name)
class Object
{
public:
virtual string toString() const
{
cout << "Object::toString:::" << endl;
char buffer[16] = {'a','b','c'};
return buffer;
}
string getClassName() const
{
return typeid(*this).name();
}
};
class ReflectManager
{
private:
static map<string, set<vector<string>>>& getMap()
{
static map<string, set<vector<string>>> map;
return map;
}
public:
ReflectManager(Object* self, const char* type, const char* name)
{
static map<string, set<vector<string>>>& attrmap = getMap();
string className = self->getClassName();
vector<string> vec;
vec.push_back(type);
vec.push_back(name);
attrmap[className].insert(vec);
}
static set<vector<string>> GetList(const string& key)
{
static map<string, set<vector<string>>> attrmap = getMap();
set<vector<string>> vecSet;
auto it = attrmap.find(key);
if (it == attrmap.end())
{
return vecSet;
}
else
{
return it->second;
}
}
};
class Josn :public Object
{
public:
string toString() const override
{
cout << "Json::toString::::"<<endl;
return string();
}
Josn(int a, bool b)
:aaa(a),
bbb(b)
{
}
private:
int aaa;
REFLECT_ATTR(int, aaa);
bool bbb;
REFLECT_ATTR(bool, bbb);
};
int main()
{
Object* objPtr = new Josn(1,true);
string objName = objPtr->getClassName();
static set<vector<string>> objSet = ReflectManager::GetList(objName);
cout << objName << endl;
for (auto it : objSet)
{
cout << "type:" << it[0] << "|||name:" << it[1] << endl;
}
return 0;
}
- 提升版:通过对象指针和offset,来实现修改成员变量值