完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文主要探讨并实现了如何用C++实现类似于.NET & JAVA的反射机制。 探讨: 最近由于项目需求,我们需要用C++编写一个脚本执行程序(简而言之,是编写一个脚本执行框架)。但是很不幸的是,C++中并没有一种想相关的机制来仅仅通过一串函数名的字符串来对应执行函数(反射机制)。 举个实际的例子 我现在有这么一个类: TestClassA{ Void func0(); Void func1(); }; 那么我希望在我的mian函数中如果出现 “TestClassA::func0”这样的字样的话 ,我能够通过某种方法真的执行这个函数(注意:不能再编写代码时写死哦~) 其实,C++中也不是真的不支持反射,比如C++11的RTti中的typeid就有那么一点点萌芽~,但是很可以的是,RTTI的重点在于类型检查,而不是执行具体方法。 废话不多说了,开始正式思路探讨吧。 思路: 我研究了一下JAVA的反射,他们是这样用的 Foo foo = new Foo("这个一个Foo对象!"); Class clazz = foo.getClass(); Method m1 = clazz.getDeclaredMethod("outInfo"); Method m2 = clazz.getDeclaredMethod("setMsg", String.class); Method m3 = clazz.getDeclaredMethod("getMsg"); m1.invoke(foo); m2.invoke(foo, "重新设置msg信息!"); String msg = (String) m3.invoke(foo); System.out.println(msg); 那么我觉得JAVA编译器在编译过程中肯定是对Foo类中的各种成员函数进行了序列化,并把它放到了一个容器中。当我们要反射时,便会从这个容器中去除对应函数的函数指针然后通过回调函数执行。 那么我们的思路 0 定义一个函数指针,该函数指针应该与我们要反射的函数同类型。 1 创建以一个反射类,该类负责序列化自写类中的方法,并将其放入一个map容器中 2 在main函数运行前,将我们可能被反射的函数进行注册 代码: 0 定义函数指针(当然我们的函数也要写成这样子的) typedef void (TestClassA::*PTRDeclareFunc)(int,int); 1 定义反射类 注意:反射类应该是单例模式;应该有一个静态方法来反射;应该有一个方法来注册; class ReflectAction{ private: map ReflectAction(){} public: //============================================= static ReflectAction& getFuncInstance(); void getClassFuncByName(string className,int a,int b) { map iter = m_classFuncMap.find(className) ; if ( iter == m_classFuncMap.end() ) return; else { TestClassA *q = new TestClassA; PTRDeclareFunc p = iter->second; (q->*p)(a,b); } return ; } //============================================= void registClassFunc(string name, PTRDeclareFunc method) { m_classFuncMap.insert(pair } }; ReflectAction& ReflectAction::getFuncInstance(){ static ReflectAction sigleClass; return sigleClass;} 2 为我们书写的类进行注册 (我们用宏的方式来代替手动书写,这样比较节省书写时间) 注意:__attribute((constructor))该关键字指该函数在main函数执行前运行 #define REGISTER(className,funcName) __attribute((constructor)) void before_main##className##funcName() { ReflectAction::getFuncInstance().registClassFunc(#className#funcName,className::funcName); } 使用方法是: REGISTER(TestClassA,m_func); 3 我们自己的类是: class TestClassA{ public: void m_func(int a,int b); }; void TestClassA::m_func(int a,int b){
|
|
相关推荐
3 个讨论
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 05:54 , Processed in 0.759319 second(s), Total 47, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号