j2jc有个高级功能就是实现从一个json字符串自动生成对象的功能
她主要是通过一个做一个map,实现类名字符串对应new对象的函数,通过字符串调用相对应的new类的函数(见string2object.h)
string2object.h
protected: typedef string2object* (*newobjfun)(); private: static handlelock x; static FAST_MAP<std::string,newobjfun> n2o; public: static bool REG(std::string name,newobjfun fun) { lock(x); if(n2o[name]) { unlock(x); return false; } else { n2o[name]=fun; unlock(x); return true; } }
REG函数就是把一个类名字符串与一个 string2object* newobjfun函数关联起来
这个函数类似这样:
string2object* newfun() { return CLASS1; }
而CLASS1又是继承string2object的
class CLASS1:public string2object { //... }
所以,当调用:
string2object * p=string2object::NEW("CLASS1");
这时候会调用之前注册的时候注册的new地址
string2object.h
static string2object * NEW(std::string name) { lock(x); newobjfun retval=n2o[name]; unlock(x); if(!retval) { return 0; } return retval(); }
这样就会得到CLASS1的对象指针
后面的事情就比较简单了,
可以做decode调用,并且调用decodesuccess方法
这就是j2jc高级应用的基本原理,当然里面还有很多事情要处理,后面的文章将会继续分析