Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45849
  • 博文数量: 6
  • 博客积分: 173
  • 博客等级: 入伍新兵
  • 技术积分: 85
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-05 14:56
文章分类

全部博文(6)

文章存档

2012年(3)

2011年(3)

我的朋友

分类: C/C++

2012-01-04 17:41:05

简介
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

自己的毕业设计中需要一个可配置的系统,使得通过配置文件,灵活改变系统模块的功能,简单而言就是根据类名创建该类的实例。

结果
下面的测试代码就是实现之后的效果:
  1. class Foo {
  2.       public:
  3.       Foo() {
  4.             cout << "Foo Created" << endl;
  5.       }
  6.       int Value() {
  7.            return m_value;
  8.       }
  9. };

  10. REGISTER_CLASS(Foo);

  11. TEST(NormalTest, All) {
  12.        Foo* ptr = static_cast(Class::NewInstance("Foo"));
  13.        EXPECT_EQ(ptr->Value(), 10);
  14.        delete ptr;
  15. }
我们定义了一个类Foo, 并通过REGISTER_CLASS对Foo进行了注册,然后通过Class::NewInstance("Foo")操作就创建了一个Foo的实例。

具体设计
首先我们需要一个map,存放每个类的类名与创建该类的对应函数,这样通过根据类名就能创建这个类,因此我们设计了Class类:

  1. typedef void* (*ClassFunc)();

  2. class Class {
  3.       public:
  4.       static void* NewInstance(const string& name) {
  5.             map::iterator it = m_cfmap.find(name);
  6.             if (it == m_cfmap.end())
  7.                   return NULL;
  8.             else
  9.                   return it->second();
  10.             }
  11.       static void RegistClass(const string& name, ClassFunc func) {
  12.             m_cfmap[name] = func;
  13.       }
  14. private:
  15.       static map m_cfmap;
  16. };

  17. map Class::m_cfmap;
Class提供了两个函数,一个用于注册类RegisterClass(),参数是类名和创建类的函数,另一个是NewInstance(),根据类名获该类的实例。每个类在定义之后都需要在Class类中注册,如何在类定义之后进行这样的操作呢? 我们不能在执行块中增加这样的代码,那样太繁琐,不智能,因此我们借用宏加静态成员完成这个功能, 我们需要一个辅助类,完成对一个类的注册工作:
  1. class Register {
  2. public:
  3.       Register(const string& name, ClassFunc func) {
  4.              Class::RegistClass(name, func);
  5.       }
  6. };
然后我们通过REGISTER_CLASS(name)宏完成对名为name的类的注册工作:
  1. #define REGISTER_CLASS(class_name) \
  2.         class class_name##Register { \
  3.         public: \
  4.                static void* Instance() { \
  5.                      return new class_name; \
  6.                } \
  7.         private: \
  8.                static const Register m_register; \
  9.         }; \
  10.         const Register class_name##Register::m_register(#class_name, class_name##Register::Instance);
REGISTER_CLASS宏定义了一个新类,该类有一个静态成员m_register,是Register类型,因此这个类在定义之后就要构造m_register,就会调用构造函数,将类名及生成函数注册进Class。

PS:这些只是实现了简单的类与类名的映射,很多java的反射功能都没有实现,比如动态选择构造函数等,如果我的项目中有需要,后续我会逐渐完善。


参考文献

1.
2. http://hi.baidu.com/bobyellow/blog/item/be914823566fbf439358076b.html
阅读(3091) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~