AOP是近年炒得很热,但却用得很少的一门技术,不过这并不能阻止我去学习它。既然能一度炒得火热,必定有过人之处。说AOP是一种思想或许更适合一些,它并不描述哪一种专有的技术,也不指定实现方式。
众所周知,C++没有丰富的动态类型信息,更没有动态生成类的功能(C++类型在编译后就基本上没有类型存在了),所以无法像java一样采用动态代理来实现AOP。
Aspect C++是C++的一个AOP实现,它使用了插入代码的方法。
一个典型的Aspect C++示例需要一个C++源文件(.cpp)、一个Aspect C++源文件(.ah),通过ac++编译器把C++源文件和Aspect C++源文件转换成混合的C++源文件(如果有头文件也会转换),最后通过普通的C++编译器编译出可执行文件。
下面是一个简单的示例:
1、C++源文件:
#include <stdio.h>
class A {
public:
int a(int i, float b);
};
int A::a(int i, float b) {
printf("inside A::a(%d, %f)\n", i, b);
return i;
}
void b(char c, char *str) {
printf("inside b(%c, %s)\n", c, str);
}
int main() {
A a;
a.a(4711, 3.14);
b('H', "ello World");
return 0;
}
2、Aspect C++源文件:
#include <stdio.h>
aspect Action {
advice execution("% A::%()") || execution("% b()") : around() {
printf("A: before(exec) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("A: after(exec) %s\n", JoinPoint::signature());
}
advice call("% A::%()") || call("% b()") : around() {
printf("A: before(call) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("A: after(call) %s\n", JoinPoint::signature());
}
};
aspect ActionB {
advice execution("% A::%()") || execution("% b()") : around() {
printf("B: before(exec) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("B: after(exec) %s\n", JoinPoint::signature());
}
advice call("% A::%()") || call("% b()") : around() {
printf("B: before(call) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("B: after(call) %s\n", JoinPoint::signature());
}
};
简单说明一下:
1、“aspect Action”定义了一个“方面”,名字是“Action”,定义一个方面可以理解为“我关注程序的这个方面”。
2、“advice 切入点:位置”定义一个“处理方法”,在切入点的指定位置上执行代码。切入点可以选择call、execution、construction、destruction,分别表示调用、执行、构造函数、析构函数。执行点可以选择before、after、around,分别表示在这些切入点的前面、后面或替换掉整个函数。
3、tpj表示thisJoinPoint,表示切入点本身。上面的例子由于使用around替换了整个执行过程,所以要执行原来的操作还需要调用tpj->proceed()。这里的around完成的功能可由一个before和一个after代替
4、切入点的匹配模式。切入点通过字符串来匹配要切入的操作,“%”字符表示匹配任意类型(或名字),在AspectJ中,这个字符是“*”,由于C++中“*”用来定义指针,所以在Aspect C++中用“%”;“...”用来匹配任意个参数。
编译:
首先运行ac++ -p <你的源文件所在目录> -d <输出文件目录> -I<附加头文件目录>,这一步会转换C++源文件和Aspect C++源文件。
如果在安装了VC,编译时可指定INCLUDE路径及_WIN32宏。
ac++ -p <你的源文件所在目录> -d <输出文件目录> -I<附加头文件目录> -I"C:\Program Files\Microsoft Visual Studio 8\VC\include" -D_WIN32
然后直接编译:
cl <源文件名>.cc
上面这个程序在处理前运行结果如下:
F:\soft\ac\examples\Action>main
inside A::a(4711, 3.140000)
inside b(H, ello World)
经Aspect C++处理后运行结果:
F:\soft\ac\examples\Action-out>main
A: before(call) int A::a(int,float)
that : 00000000
target: 0012FF73
B: before(call) int A::a(int,float)
that : 00000000
target: 0012FF73
A: before(exec) int A::a(int,float)
that : 0012FF73
target: 0012FF73
B: before(exec) int A::a(int,float)
that : 0012FF73
target: 0012FF73
inside A::a(4711, 3.140000)
B: after(exec) int A::a(int,float)
A: after(exec) int A::a(int,float)
B: after(call) int A::a(int,float)
A: after(call) int A::a(int,float)
A: before(call) void b(char,char *)
that : 00000000
target: 00000000
B: before(call) void b(char,char *)
that : 00000000
target: 00000000
A: before(exec) void b(char,char *)
that : 00000000
target: 00000000
B: before(exec) void b(char,char *)
that : 00000000
target: 00000000
inside b(H, ello World)
B: after(exec) void b(char,char *)
A: after(exec) void b(char,char *)
B: after(call) void b(char,char *)
A: after(call) void b(char,char *)
相关推荐
C++平台的面向切面编程(aop)的理论知识。需要的直接拿去研究吧。
本文档记录了在c++语言中使用AOP的技术
面向横截面编程面向横截面编程面向横截面编程面向横截面编程面向横截面编程
本教程介绍 AOP 及其基本概念。AOP 及其相关的工具使您可以将基本横切关注点(如日志记录和安全)的代码,与程序的核心应用逻辑相分离。AOP 通过使代码更具有可读性、更不容易出错以及更容易设计和维护,改善了代码...
搜集了 万方数据库 相关论文 期刊 以及网上 这方面几乎所有网页 都是自己学习之后留下来的 免去了大家搜集资料整理的麻烦 万方账号还是找别人借的~~~ 网上这方面 特别是c++可谓少之又少 搜集不容易 所以资源分高些 ...
利用面向方面编程技术实现应用层检查点与恢复机制,实现C++的进程跟踪、检查点文件生成和进程恢复。
AOP面向切面架构设计Demo
AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程。 OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决问题的方法中的共同点,是对OO思想的一种补充! 主要的功能是:...
Unity结合三导实现依赖注入跟AOP Unity结合三导实现依赖注入跟AOP.zip
②IOC、AOP、代理、切面、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来...
(1)、spring 的核心如:IOC AOP 等,注入一个 UserDaoImpl 时,UserDaoImpl (2)、数据库索引的底层实现 (3)、Lint
利用AOP的思想,通过方法交换(Method Swizzle黑魔法,修改 ios 系统类库方法)的做法,对登陆权限的统一管理,避免判断逻辑的分散。可以举一反三,思考类似需求的处理方案.zip 软件开发设计:PHP、QT、应用软件开发、...
spring相关的demo,包含spring的ioc注入,aop的使用,mybatis的整合(1).zip
Lokie:使用C ++和libffi的iOS高效AOP库
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】...
OOP 可以说是影响了整个计算机发展的一个伟大的编程思想,JAVA 、 C# 、 C++ 等都是 OOP 的编程语言,OOP 使我们的编程更加简单易学。OOP 的核心思想:抽象、继承、封装、多态,OOP 是一种从上到下的编程思想,在...
底层基于Sogou C++ Workflow,是高性能、低延迟、轻量级RPC系统的极佳选择。且加入了AOP面向切面的模块,支持Metrics(监控指标)和Trace(链路追踪)功能,可上报到多种云原生系统,包括OpenTelemetry。是全搜狗...
面向切面编程事例,通过RealProxy、特性、静态方法三种方法去实现AOP
答:折构函数式销毁一个类的函数,虚函数是为了C++的动态绑定而设计的。 描述你的编程风格? 答:类名首字母大写,常量一般全部大写,给自己的代码加注释。 控制流程? 答:控制流程一般使用if判断条件。有第二分支...
项目真实可靠,源码都经测试过,能跑通,可用作本科毕业设计,请放心下载使用。