上一篇已经讲了j2jc实现从json数据直接生成对象的基本原来,本篇将继续分析是如何做到的
如果你有执行看用j参数生成的头文件你会发现,里面所有的类都是继承与一个叫json2jsoncpp的类的
class rpc1:public json2jsoncpp { private: virtual bool decodesuccess(){return true;} static string2object * NEW() { return new rpc1; } public: static bool REG(newobjfun fun=0) { if(fun)return string2object::REG("rpc1",fun); else return string2object::REG("rpc1",NEW); } static bool UNREG() { return string2object::UNREG("rpc1"); } //... }
这个类就来至json2jsoncpp.h
然后看json2jsoncpp.h
其实这个json2jsoncpp也是继承与string2object的
class json2jsoncpp:public string2object { public: template<typename NEWCLSX> static string2object * NEW() { return new NEWCLSX; } template<typename REGCLSX> static bool REG() { return REGCLSX::REG( NEW<REGCLSX> ); } template<typename UNREGCLSX> static bool UNREG() { return UNREGCLSX::UNREG(); } //... }
注册代码:
class G1:public rpc1 { //... } //////////////////////////// //注册G1 json2jsoncpp::REG<G1>();
G1是继承rpc1的,所以自然有了rpc1的所有内容,包括
static bool REG(newobjfun fun=0) { if(fun)return string2object::REG("rpc1",fun); else return string2object::REG("rpc1",NEW); }
主要关注return string2object::REG("rpc1",fun); 这一行,她就是向string2object注册名字和new函数
但是fun从哪来呢?
看代码return REGCLSX::REG( NEW<REGCLSX> );
REGCLSX就是G1
那就是掉用G1::REG( x ) (其实就是调用rpc1::REG)
x就是那个fun了
再看NEW<REGCLSX> 实际上就是:
static string2object * NEW() { return new G1; }
这个new 函数了
所以自然把字符串“rpc1” 和 static string2object * NEW() { return new G1; } 关联了起来
后面的事情就好办多了
先写到这里,大家先消化消化