一:一个典型的aspect类的形式如下:
public aspect MyAspectj {
//定义连接点函数
pointcut callF(): execution(* f(..)) && cflow(call(* Test.foo(..)));
//定义通知函数
before() : callF() {
System.out.println("before call f();");
}
}
二:切点pointcut的定义:
1):方法的访问
1: execution():表示方法执行是进行匹配,如下所示:
execution(void Test.setX(int,**))
2: call():表示在方法被调用时候进行匹配,如下所示:
call(void Test.setX(int,**))
2):字段的访问:
1: set():表示目标对象的修改,如下所示:
before(int newval): set(int Test.x) && args(newval) {
if(newval > Test.MAX_CHANGE) {
throw new RuntimeException("error");
}
}
public static final int MAX_CHANGE = 100;
int x = 100;
public static void main(String[] args) {
Test t = new Test();
t.x = 10000;
System.out.println(t.x);
}
2:get():表示目标对象的获取,如下所示:
before(): get(int Test.x)
3):对象的状态:
1:this(SomeType):表示当前在执行的对象是SomeType类型进行匹配。
2:target(SomeType):表示目标对象是SomeType类型时进行匹配。
3:args(SomeType):表示目标函数的函数参数是SomeType类型时进行匹配。
4):连接点执行流程
1:cflow(pointcut):表示在执行连接点pointcut所匹配的函数时进行匹配,如下所示:
cflow(call(void Test.main()))
其中的call(void Test.main())就是一个连接点;
2:cflowbelow(pointcut):表示执行连接点pointcut之外所匹配的函数是进行匹配,如下所示。
cflow(call(void Test.main()))
5):属于关系
1:within(MyClass)表示当前正在执行的代码属于MyClass类时进行匹配(连接点匹配的时候只匹配Myclass类中的连接点),如下所示:
within(point)
2:withincode(method):表示在属于method函数时进行匹配,例如夏例表示的时匹配函数foo()的调用。
withincode(public void foo())
三:匹配表达式的通配符
使用星号"*"可以匹配切点中函数表达式中的任何一个元素,包括函数的修饰符,返回值的类型,类名,方法名,参数名。
1)星号(*)
1:下例将匹配任何函数,而不管函数返回什么的类型。
execution(* *(..))
2:下例用来匹配任何名为set的方法,而不管函数返回的类型。
call(* set(..))
3:下例用于匹配返回值为int型的任何函数。
execution(int *(..))
4:下例用来匹配函数名为setY,参数类型为long的函数。
call(* setY(long))
5:下例用于匹配类Point的函数setY,且函数的参数类型为int。
call(* Point.setY(int))
6:下例用来匹配任意的构造函数,且该构造函数含有两个int类型的参数。
call(*.new(int,int))
7:下例用来匹配任何public类型的函数。
call(public * *(..))
8 : 下例用来匹配任何非静态的函数。
execution(!static * *(..))
9:下例用来匹配任何public类型的,非静态的函数
execution(public !static * *(..))
2):加号(+)
1:匹配Foo的构造函数
call(Foo.new())
2:下例表示Foo及其所有子类的构造函数。
call(Foo+.new())
3:下例以Handler结尾的类名及其所有子类的构造函数。
call(*Handler+.new())
四:匹配表达式的组合
!:逻辑非;
|| or OR:逻辑或;
&& or And:逻辑与;
():用于分钟。
一些切点的实例:
//实例一:
pointcut setBefore(Object point, Integer id) : target(point)
&& execution(public void com.gaojian.aspectj.java1.*.setAll(Integer,..))
&& args(id,..);
before(Object point, Integer id) : setBefore(point, id){
System.out.println("多个参数的方法中args的使用");
}
//实例二:
pointcut setBefore(Object point, Integer key) : target(point)
&& ( execution(public void com.gaojian.aspectj.java1.*.setId(Integer))
|| execution(public void com.gaojian.aspectj.java1.*.setAge(Integer))
|| execution(public void com.gaojian.aspectj.java1.*.setAll(Integer,..))
)
&& args(key,..);
before(Object point, Integer key) : setBefore(point, key){
System.out.println("设值的参数为:"+key);
}
//实例三:
pointcut setIdBefore():execution(* setId(..)) && (within(com.gaojian.aspectj.java1.PointcutClass1) || within(com.gaojian.aspectj.java1.PointcutClass2));
before() : setIdBefore(){
System.out.println("切入点中within的使用");
}
分享到:
相关推荐
maxwell simplorer simulink 永磁同步电机矢量控制联合仿真,电机为分数槽绕组,使用pi控制SVPWM调制,修改文件路径后可使用,软件版本matlab 2017b, Maxwell electronics 2021b 共包含两个文件, Maxwell和Simplorer联合仿真文件,以及Maxwell Simplorer simulink 三者联合仿真文件。
基于springboot的网上图书商城--论文.zip
门板边挡板分离喂料机sw19全套技术资料100%好用.zip
信号与系统matlab仿真实验报告2024(学生提交).docx
洗砂机stp全套技术资料100%好用.zip
用句子记忆单词带背版本,适合时间比较充足想打好基础的同学
电子PCB板龙门铣自动化生产线sw17可编辑全套技术资料100%好用.zip
最新紧固件标准型号对照表.docx
【创新无忧】基于matlab遗传算法GA优化极限学习机KELM故障诊断【含Matlab源码 10735期】.zip
【创新无忧】基于matlab极光算法PLO优化极限学习机KELM故障诊断【含Matlab源码 10707期】.zip
java面向对象程序设计实验报告
展示PRD文档的关键要素编写具体示例。同时提供了一份模板,方便撰写PRD文档。
内容概要:本文详细介绍了一个基于广义变分同步优化(GVSAO)的时间序列预测模型项目。该项目涵盖了从项目背景到最终部署的整个流程,包括数据预处理、模型构建、训练、优化、GUI界面设计、实时预测及系统部署等方面。GVSAO作为一种新型优化方法,能更好地处理非线性关系和高维数据的特点,在预测股票价格、电力负荷、天气变化等方面显示出优越性能。文中提供的MATLAB代码和可视化工具使模型实现和评估更为便捷。 适合人群:对时间序列预测感兴趣的科研工作者、学生和工程师,特别是那些想要深入了解同步优化技术及其应用场景的人。 使用场景及目标:①适用于金融、能源、气象和制造业等多个领域的时间序列预测;②提升模型预测精度;③提供一个完整的项目实施模板供学习模仿。使用该模型可以更有效地挖掘时间序列数据背后隐含的趋势和规律,辅助商业决策和社会管理。 其他说明:本文档不仅包含理论概念和技术细节,还有丰富的实例演示,可以帮助读者全面掌握基于GVSAO的时间序列预测技巧。同时,附带完整的程序代码使得研究成果可以直接应用于实际工作中。
DSP芯片程序读取 DSP28德州仪器28系列DSP反汇编,定点器件和浮点器件均支持,能够根据out、hex或bin文件建立可以编译的CCS汇编语言工程,并且编译后可生成二进制完全相同的bin文件,方便进行研究软件设计思路,二次开发,器件迁移,混淆再链接,研究通信协议,解除ID限制,提取算法等,小批量的代码转C。
内容概要:本文介绍了一种基于对比学习的图异常检测算法,涵盖数据预处理、对比样本构建、模型设计(含选择适当的GNN架构及设计对比学习模块)、异常检测流程、结果评估方法和代码实例六个主要环节。文章特别强调在常规数据集(如Cora、PubMed)的应用上力求获得较高的AUC分数,超过80%,并且提供了详细的操作指导和Python源代码示例供开发者学习。 适用人群:主要面向有一定机器学习、深度学习理论基础,尤其关注图结构数据处理的研究人员、数据科学家和技术专家。对于有志于从事网络安全监控、金融风控等领域工作的专业人士尤为有用。 使用场景及目标:①针对具有大量节点关系的数据结构进行高效的异常识别;②利用先进的AI技术和工具箱快速搭建并迭代优化系统性能,达成高效准确的预测;③为后续研究提供参考和启示。 其他说明:文中不仅深入解析了每一阶段的技术细节,而且通过具体的Python实现片段帮助读者更好地理解和实践这一复杂的过程。对于期望深入挖掘对比学习在非传统数据格式下应用可能性的人而言是个宝贵的参考资料。
MIPI-DPU platform TCL
【JavaScrip】一个傻妞机器人插件库_pgj
comsol锂离子电池组充放电循环强制液冷散热仿真。 模型为SolidWorks导入,可以提供原模型。 电池模型:一维电化学(p2d)模型耦合三维热模型
饼干分包sw20可编辑全套技术资料100%好用.zip
自适应大领域搜索算法(ALNS)matlab解决tsp问题,与传统大规模领域搜索算法(LNS)相比收敛性强,运行时间短,很好的学习资料