当前位置: 首页 > news >正文

反射机制

反射这个特性在C++中是没有的。所谓反射,自己的认为就是通过一个名字就可创建、调用、获取信息等一系列的操作,这个在脚本语言里面是比较常见的,COM组件也类似,知道个ID名,就可以做很多的工作了。

下面提供一种反射技术的实现(C++):

 UML关系:

常见的关系有:继承(Inheritance),关联关系(Association),聚合关系(Aggregation),复合关系(Composition),依赖关系(Dependency)。
其中,聚合关系(Aggregation),复合关系(Composition)属于关联关系(Association)。
一般关系表现为继承或实现关系(is a),关联关系表现为变量(has a ),依赖关系表现为函数中的参数(use a)。

 

                                             UML图

  1 //--反射技术的实现(C++)
  2 //
  3 #ifndef __REFLECTIONFACTORY_H__
  4 #define __REFLECTIONFACTORY_H__
  5 
  6 #include<iostream>
  7 #include<string>
  8 #include<map>
  9 using namespace std;
 10 
 11 //应用(产品)接口类
 12 class Base
 13 {
 14 public:
 15     Base(){m_className="Base";}
 16     virtual ~Base(){}
 17     virtual void me(){ cout<<"me is :"<<m_className<<endl;}
 18     
 19 public:
 20     string m_className;
 21 };
 22 
 23 //---------------------------------------------------------------------------------------
 24 //反射工厂类(抽象工厂模式)
 25 class ReflectionFactory
 26 {
 27 public:
 28     //反射技术,根据类名实例化对应类 进行调用
 29     static Base * GetProcedure(const string & name);
 30     static int    ExecuteProcedure(const string &name);
 31     //不带参数方式执行,即。直接调用
 32     static int    ExecuteProcedure(Base* pProc);
 33     
 34 public:
 35     static int    SetRelationMapping(const string &name,Base * procedure);
 36     /*here,名称串和已实例化类指针的对应关系,这儿为甚不用变量而用函数来实现变量!?
 37       是因为接下来的宏注册!!!!(深层原因???--宏注册的变量定义是在静态成员变量定义之前?)
 38     */
 39     static        map<string,Base*> *GetRelationMapping();
 40 };
 41 
 42 #define INSTALL_PROCESSBASE_INSTANCE(classname) \
 43     int classname##Suffix = ReflectionFactory::SetRelationMapping(#classname,new classname());
 44 
 45 #endif //__REFLECTIONFACTORY_H__
 46 
 47 //
 48 //反射工厂类的实现
 49 map<string,Base*> * ReflectionFactory::GetRelationMapping() 
 50 {
 51     //局部静态变量:函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。
 52     static map<string,Base*> relationMapping;
 53     return &relationMapping;
 54 }
 55 
 56 Base * ReflectionFactory::GetProcedure(const string & name) 
 57 {
 58     map<string,Base*> &procs =  *(GetRelationMapping());
 59     
 60     map<string,Base*>::iterator itr;
 61     itr=procs.find(name);
 62     if (itr != procs.end()) 
 63     {
 64         return itr->second;  
 65     }
 66     return NULL;          
 67 }
 68 
 69 int ReflectionFactory::SetRelationMapping(const string &name,Base * procedure) 
 70 {
 71     map<string,Base*> &procs =  *(GetRelationMapping());
 72     Base * p =GetProcedure(name);
 73     if (NULL == p)  {
 74         procs[name] = procedure;
 75     }
 76     procedure->m_className = name;
 77     
 78 #ifdef _DEBUG_
 79     cout << "register class instance:" << name << endl;
 80 #endif
 81     
 82     return 0;
 83 }
 84 
 85 int ReflectionFactory::ExecuteProcedure(const string &name) 
 86 {
 87     int iRet=0 ;
 88     string proc_name = name;
 89     Base *proc = ReflectionFactory::GetProcedure(proc_name);
 90     
 91     if (NULL == proc)
 92     {iRet = 9;}
 93     else
 94     {iRet = ExecuteProcedure(proc);}
 95     
 96 #ifdef _DEBUG_
 97     cout << "Executed Procedure:" << proc->m_className << endl; 
 98 #endif
 99     
100     return iRet;
101 }
102 
103 int ReflectionFactory::ExecuteProcedure(Base* pProc)
104 {
105     pProc->me();
106     return 0;
107 }
108 //
109 //应用(产品)类的定义
110 class A1 :public Base
111 { 
112 };
113 class A2 :public Base
114 { 
115 };
116 class A3 :public Base
117 { 
118 };
119 
120 //
121 //注册类名称和其对应实例化指针的Mapping:
122 INSTALL_PROCESSBASE_INSTANCE(A2);
123 INSTALL_PROCESSBASE_INSTANCE(A3);
124 INSTALL_PROCESSBASE_INSTANCE(Base);
125 
126 //
127 //根据类名来实例化和调用产品类,样例:
128 int main()
129 {
130     map<string,Base*> &procs =  *(ReflectionFactory::GetRelationMapping());
131     cout<<"ReflectionFactory::size(): "<<procs.size()<<endl;
132     
133     string l_className="Base";
134     cout<<l_className.c_str()<<endl;
135     int t_ret = ReflectionFactory::ExecuteProcedure(l_className);
136         
137     l_className="A2";
138     cout<<l_className.c_str()<<endl;
139     t_ret = ReflectionFactory::ExecuteProcedure(l_className);
140         
141     return t_ret;
142 }
Reflection.cpp

 该样例使用了工程模式、策略模式、反射机制,就差一个配置文件机制就O了...

转载于:https://www.cnblogs.com/book-gary/p/3586884.html

相关文章:

  • 移动端基于HTML模板和JSON数据的JavaScript交互
  • 度分秒的正则表达式
  • JQuery 网页选项卡制作
  • UML类图几种关系的总结
  • groovy-file2
  • linux 软件包管理
  • 【转】排名Top 16的Java实用类库
  • 繁杂产生利润 但与你无关-【软件和信息服务】2014.03
  • JSP合用html5 尝试(一)
  • 文件夹的一个小勾(复选框)
  • 外网主机访问虚拟机下的web服务器(NAT端口转发)
  • 什么是Web Service?
  • javascript学习之路之元素获取和设置属性
  • Mongo数据模型
  • linux目录结构,文件管理
  • [NodeJS] 关于Buffer
  • Akka系列(七):Actor持久化之Akka persistence
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • E-HPC支持多队列管理和自动伸缩
  • JavaScript设计模式与开发实践系列之策略模式
  • js学习笔记
  • Mysql5.6主从复制
  • Spring Cloud中负载均衡器概览
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue-cli3搭建项目
  • 从伪并行的 Python 多线程说起
  • 构造函数(constructor)与原型链(prototype)关系
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端存储 - localStorage
  • 听说你叫Java(二)–Servlet请求
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #if和#ifdef区别
  • #宝哥教你#查看jquery绑定的事件函数
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)Java算法:二分查找
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • ***利用Ms05002溢出找“肉鸡
  • *上位机的定义
  • .cfg\.dat\.mak(持续补充)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net经典笔试题
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [android] 切换界面的通用处理
  • [APIO2015]巴厘岛的雕塑
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!