銆銆鏈榪戯紙鍏跺疄涔熸湁涓孌墊椂闂翠簡(jiǎn)錛夛紝鍦╟++欏圭洰涓渶瑕佺敤鍒扮被浼糺ava鐨勫弽灝勬満鍒訛紝鏃墮棿涔熸瘮杈冭刀錛屽彧鑳藉懆鍥寸湅鐪嬫湁娌℃湁鐜版垚鐨勫簱鍙敤浜?jiǎn)锛屾墤謭扮殑璧勬枡涔熶笉绠棡畱锛屼絾澶氭暟閮芥槸鍏充簬鍔ㄦ佸垱寤虹被鐨勶紝鏈夌偣鍍忓伐鍘傛ā寮忥紝鑰屾垜闇瑕佺殑錛屾槸鎶婂疄浣撶被涓殑灞炴у弽灝勫嚭鏉ャ傛渶鍚庯紝鎵懼埌浜?jiǎn)涓涓彨LibReflection鐨勪笢瑗匡紝铏界劧鍚庢潵榪樻槸娌$敤涓婅繖涓紝浣嗘槸紼嶅井鐪嬩簡(jiǎn)涓涓嬩唬鐮侊紝榪樻槸鏈変笉灝戞敹鑾鳳紝鎵浠ュ氨鍦ㄨ繖閲岃褰曚笅鏉ヤ簡(jiǎn)錛屽綋鍋氬涔?fàn)锛屼篃褰撳仛瀵箻q欎釜搴撶殑涓涓垎鏋愬惂銆?br style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" />銆銆LibReflection鏄睘鎬у拰鍑芥暟鍙嶅皠閮芥湁瀹炵幇鐨勶紝鑰屾暣涓簱绔熺劧灝變竴涓猦鏂囦歡錛屾湰浜虹簿鍔涙湁闄愶紝鍙妸灞炴у弽灝勬娊鍙栧嚭鏉ワ紝鐩鎬俊紱誨疄闄呭簲鐢ㄤ篃鏈夎窛紱伙紝濡傛灉鏈変漢璺繃鐪嬪埌錛岃浣撹皡鍒媿鐮栦簡(jiǎn)銆?br style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" />銆銆閭d箞錛岄鍏堢湅涓涓嬩嬌鐢細(xì)
TestClass inst;
tat::tat_class *test_class = TestClass::get_class_ptr();
std::map<std::string,tat::tat_field> field_map = test_class->get_fields();
tat::tat_field test_vec_field = field_map.find("_vec_f")->second;
std::vector<int> vec;
test_vec_field.get(&inst,vec);
vec.push_back(22);
test_vec_field.set(&inst,vec);
std::cout<<inst._vec_f[0]<<std::endl;
銆銆TestClass綾誨厛涓嶇粰鍑猴紝鍙嶆灝辨槸璇ョ被鏈変竴涓悕瀛椾負(fù)“_vec_f”鐨勫睘鎬э紝綾誨瀷鏄痵td::vector<int>錛岀劧鍚庤繖孌典唬鐮侀氳繃鍙嶅皠淇敼_vec_f鐨勫唴瀹廣傘傝嚦浜巘at_class鍜宼at_field錛岀浉淇$啛鎮(zhèn)塲ava鐨勪漢閮借兘鐚滃嚭鏄粈涔堜簡(jiǎn)銆?br style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" />銆銆鑾峰彇鍙?qiáng)璁揪|竴涓疄渚嬬殑鎴愬憳鍙橀噺鐨勫間笉鏄毦浜嬶紝鐢ㄤ竴涓畯灝卞彲浠ヤ簡(jiǎn)錛?br />
#define _OFFSET_(_Obj_Ty,_Key) \
((unsigned long)(&((_Obj_Ty *)0)->_Key))
銆銆榪欎釜瀹忓簲璇ヤ篃涓嶉毦鐞嗚В錛屽氨鏄幏鍙栨垚鍛樺彉閲忕浉瀵瑰疄渚嬫寚閽堢殑鍋忕Щ鍊箋傝屽叧閿棶棰樻槸錛屽浣曢氳繃鍙橀噺鍚嶇О灝辮兘鏌ユ壘鍑?guó)櫩欎釜鍋徔U誨憿錛熷浣曞湪鍙橀噺鍒濆鍖栫殑鏃跺欏氨鑳借褰曚笅榪欎釜鍋忕Щ鍛紵鎴戜滑鍙互閫氳繃瀹忔潵澹版槑鍙橀噺錛岄偅涔堝0鏄庣殑鏃跺欏氨鍙互鍋氫竴浜涗簨鎯呬簡(jiǎn)錛屼絾鍏蜂綋鍋氫簺浠涔堬紝榪樻槸娌″ご緇?br />銆銆榪欎釜闂鑷繁鎬濊冧簡(jiǎn)涓孌墊椂闂達(dá)紝鏃犳灉銆傜劧鍚庣湅浜?jiǎn)涓涓嬪疄鐜幫紝娣辨劅鑷繁鐨勫熀紜榪樻病榪囧叧錛屽叾瀹炶鐧戒簡(jiǎn)灝辨槸涓や釜涓滆タ錛氭瀯閫犲嚱鏁般侀潤(rùn)鎬佹垚鍛樺彉閲忋?br />銆銆鎴戜滑鐨勭洰鏍囨槸寰堟槑紜殑錛岃鍋氬埌java鐨勬晥鏋滐紝緇撳悎涓婇潰閭d釜瀹忥紝涔熶笉闅炬兂璞″嚭Class鍜孎ield綾葷殑鏍峰瓙錛堣繖閲屾槸tat_class鍜宼at_field錛夛紝tat_class鏃犻潪灝辨槸淇濆瓨浜?jiǎn)涓涓猰ap錛宬ey鏄睘鎬х殑鍚嶇О錛寁alue鏄痶at_field錛岃嚦浜巘at_field灝辯畝鍗曚簡(jiǎn)錛屾牳蹇?jī)灏辨槸淇濆瓨鍐呭瓨鐨勫亸绉诲鹼紝鍐嶆彁渚涙搷浣滃肩殑鎺ュ彛灝卞彲浠ヤ簡(jiǎn)銆?br />銆銆鍏堟潵鐪嬬湅tat_class錛?br />
class tat_class
{
private:
std::map<std::string,tat_field> _field_map;
std::string _key;
public:
std::map<std::string,tat_field> get_fields()
{
return this->_field_map;
}
tat_field get_field(std::string key)
{
std::map<std::string,tat_field>::iterator itr = _field_map.find(key);
return (*itr).second;
}
void add_field(const tat_field &field)
{
_field_map.insert(std::pair<std::string,tat_field>(field.get_key(),field));
}
};
銆銆娌℃湁浠涔堢悊瑙d笂鐨勯毦鐐瑰惂銆?br />銆銆鐒跺悗鐪嬬湅tat_field錛?br />
class tat_field
{
private:
unsigned long _offset;
std::string _key;
public:
tat_field(unsigned long offset,std::string key):_offset(offset),_key(key){}
tat_field(const tat_field &field)
{
this->_offset = field._offset;
this->_key = field._key;
}
public:
template<typename _Obj_Ty,typename _Value_Ty>
void get(_Obj_Ty *obj,_Value_Ty &value)
{
value = *((_Value_Ty *)((unsigned char *)obj + _offset));
}
template<typename _Obj_Ty,typename _Value_Ty>
void set(_Obj_Ty *obj,const _Value_Ty &value)
{
*((_Value_Ty *)((unsigned char *)obj + _offset)) = value;
}
std::string get_key() const
{
return this->_key;
}
};
銆銆鍙橀噺鍊肩殑get鍜宻et鍑芥暟浣跨敤浜?jiǎn)妯℃澘锛寴q欐槸涓轟簡(jiǎn)浣跨敤鐨勬椂鍊欒兘浣滅畝鍗曠殑綾誨瀷鎺ㄦ柇銆?br />銆銆鐒跺悗灝辨槸閲嶇偣浜?jiǎn)锛屽浣曞湪澹版槑绫荤殑鏃跺欏氨鎶妕at_class娉ㄥ叆鍛紵濡傚墠闈㈣鐨勶紝闈?rùn)鎬佹垚鍛樺彉閲忥細(xì)
#define CLASS_REGISTER(_Obj_Ty) \
public: \
static tat::tat_class * get_class_ptr() \
{ \
static tat::tat_class __class_##_Obj_Key##__; \
return &__class_##_Obj_Key##__; \
}
銆銆榪欎釜瀹忓仛浜?jiǎn)涓や欢浜嬪Q氱涓錛屽0鏄庨潤(rùn)鎬佸嚱鏁癵et_class_ptr()錛岃繑鍥瀟at_class綾誨瀷錛岀浜岋紝褰撶劧灝辨槸鍒濆鍖杢at_class浜?jiǎn)锛屽洜湄?fù)鍚屾牱鏄潤(rùn)鎬侊紝鎵浠ヤ笉鍚岀殑瀹炰緥灝卞叡浜簡(jiǎn)銆?br />銆銆鎺ヤ笅鏉ユ槸鍙︿竴涓噸鐐癸紝濡備綍鍦ㄥ0鏄庢垚鍛樺彉閲忕殑鏃跺欐妸tat_field娉ㄥ叆鍒皌at_class涓紝榪樻槸鐢ㄥ畯瑙e喅錛?br />
#define FIELD_REGISTER(_Access,_Field_Ty,_Field_Key,_Obj_Ty) \
_Access: \
_Field_Ty _Field_Key; \
private: \
class __field_register_##_Field_Key##__ \
{ \
public: \
__field_register_##_Field_Key##__() \
{ \
static tat::__field_register__ reg_##_Field_Key( \
_Obj_Ty::get_class_ptr(), \
_OFFSET_(_Obj_Ty,_Field_Key), \
#_Field_Key); \
} \
}_Field_Key##_register;
銆銆鍒嗘瀽榪欎釜瀹忥紝棣栧厛褰撶劧鏄0鏄庡彉閲忎簡(jiǎn)錛涚劧鍚庡氨鏄竴涓縐樼殑綾伙細(xì)__field_register_##_Field_Key##__錛岃繖涓被灝卞彧鏈変竴涓瀯閫犲嚱鏁幫紝鏋勯犲嚱鏁伴噷闈㈠張鏄竴涓潤(rùn)鎬佸彉閲忥紝綾誨瀷鏄痶at::__field_register__錛屽彲浠ユ兂璞″緱鍒幫紝鏃㈢劧tat_class宸茬粡鍙互澹版槑鍑烘潵浜?jiǎn)锛宼at_field鑷劧涔熸病鏈夐毦搴︼紝浣嗗0鏄庢槸涓嶈凍澶熺殑錛岃繕闇瑕佹斁鍒皌at_class鐨刴ap閲岄潰鎵嶇畻瀹屾垚錛屽湪澹版槑涓涓彉閲忕殑鏃跺欙紝鑳藉仛浜嬬殑鍦版柟錛屾垜鍙兘鎯沖埌鏄瀯閫犲嚱鏁頒簡(jiǎn)錛屾墍浠ュ氨鏈変簡(jiǎn)鍒氬垰閭d釜紲炵鐨勭被錛岄偅涓被鐨勫敮涓浣滅敤灝辨槸鍏舵瀯閫犲嚱鏁幫紝鑰屾瀯閫犲嚱鏁伴噷闈㈠0鏄庨潤(rùn)鎬佸彉閲忥紝鍒欐槸闃叉澶氭瀹炰緥鍖栫被甯︽潵鐨勫啑浣欐暟鎹紝紜繚涓涓垚鍛樺彉閲忓彧鏈変竴涓猼at_field錛?br />銆銆鍓╀笅鐨勫叧閿紝灝辨槸tat::__field_register__浜?jiǎn)锛?xì)
class __field_register__
{
public:
__field_register__(tat_class *class_ptr,unsigned long offset,std::string key)
{
tat_field field(offset,key);
class_ptr->add_field(field);
}
};
銆銆娌℃湁浠涔堢縐樼殑鍦版柟錛岃繖涓笢瑗垮氨榪欎箞瀹屾垚浜?jiǎn)銆?br />銆銆宸偣蹇樹簡(jiǎn)TestClass鐨勫0鏄庯細(xì)
#include "fieldref.h"
class TestClass
{
public:
TestClass(void);
~TestClass(void);
CLASS_REGISTER(TestClass)
FIELD_REGISTER(public,long,_long_f,TestClass)
FIELD_REGISTER(public,int,_int_f,TestClass)
FIELD_REGISTER(public,std::string,_str_f,TestClass)
FIELD_REGISTER(public,std::vector<int>,_vec_f,TestClass)
};
銆銆濂藉惂錛屽鏋滆鍒板疄闄呭簲鐢ㄧ殑闂錛屾磼瀹剁‘瀹炴病鏈夎冭檻澶錛屽弽姝f祴璇曞嚱鏁拌兘璺戯紝緇撴灉涔熷浜?jiǎn)锛寢z掑涔熷氨婊¤凍浜?jiǎn)锛尀鍗暰U殑褰撳仛鏄竴嬈″疄楠岋紝鎴栬呮槸瀛︿範(fàn)鑰屽凡銆?/div> 
]]>