AspectJ 基础

 前两篇AspectJ入门的文章大致的介绍了AspectJ,本文更完整、更详细的介绍AspectJ的基础知识。包括了切点、连接点、类型间声明及thisJoinPoint的基础知识,来更好的理解AspectJ的语法。

1 切点和连接点

挑选切点的时候,我们还可以通过方法的访问权限、是否是static来区分,同时也能挑选出接口的方法:

public aspect PointPickAspect {pointcut staticPoint(): call(static * article.service.PointPick.*(..));pointcut privatePoint(): call(private * article.service.PointPick.*(..));pointcut interfacePoint(): call(* article.service.CustomInterface.*(..)); // CustomInterface是接口before(): staticPoint() || privatePoint() || interfacePoint() {System.out.println();System.out.println(thisJoinPoint.toLongString());}
}

1.1 call 与 execution

call:获取调用签名时的连接点。在实际开发中会用到。

execution:获取代码段在运行时的连接点。通常用于跟踪调试。

call 与 execution对于within 或withincode的匹配方式也不同。

public class ExecutionAndCall {static void fun(int num) {System.out.println(num);System.out.println();if (num > 0) fun(--num);}public static void main(String[] args) {ExecutionAndCall.fun(4);}}public aspect ExecutionAndCallAspect {pointcut callPoint(): call(void article.service.ExecutionAndCall.fun(..)) &&withincode(void article.service.ExecutionAndCall.fun(..)); // 切点是:fun中递归调用的fun连接点pointcut executionPoint(): execution(void article.service.ExecutionAndCall.fun(..));// 注意execution 的连接点严格意义来说不在fun方法体内,所以加上:// && withincode(void article.service.ExecutionAndCall.fun(..)) 将匹配不到任何连接点before(): callPoint() {System.out.println("-----callPoint-----");System.out.println(thisJoinPointStaticPart.getSignature());System.out.println(thisJoinPointStaticPart.getSourceLocation());}before(): executionPoint() {System.out.println("----executionPoint----");System.out.println(thisJoinPointStaticPart.getSignature());System.out.println(thisJoinPointStaticPart.getSourceLocation());}}

1.2 切点类型

分类指示符

选择连接点的特定种类,如:call、execution、hander、get、set

作用域指示符

选择一组连接点。with及withincode

上下文指示符

基于上下文匹配,可选择地绑定的指示符。如 this、target、args、@annotation

表 切点类型

作用域指示符匹配速度非常快,它们可以非常快速地消除不应该进一步处理的连接点组。

所以好的切点标准是,至少包括作用域指示符和分类指示符。

2 类型间声明

AspectJ 可以为类声明及定义成员(字段、方法和构造器),还可以为类实现新的接口或者继承新的类型。

在AspectJ 中为类定义的成员,如果其访问权限运行,可以在类中及切面中使用。

private

只限于当前切面访问(被定义的类中也不能访问)。就是在其他切面或这个类也定义了同名的属性,也不会互相干扰。

default

包访问权限。在这个切面所在包下的切面及类可以访问。可能会发生同名冲突。

public

任何切面或者类都可以访问,可能会发生同名冲突。

表 Aspect类型间声明支持的访问权限

还可以定义类新的构造器。

public class InterEntityParent {void sayByFather() {System.out.println("InterEntityParent 父级");}
}public class InterEntity {private int x = 0;public void setX(int x) {this.x = x;}public int getX() {return x;}public static void main(String[] args) {InterEntity interEntity = new InterEntity(99); // 当前类并未定义该构造器,但是在切面中定义了interEntity.show();
//        interEntity.sayByFather(); // 编码时虽红字提示,但是能运行,在切面中为该类继承了InterEntityParent}
//    运行结果:
//    article.service.InterEntity@2a84aee7.x:99
//    同时可以访问到同包下,为该类定义的default访问类型变量:InterEntityAspect定义的属性
//    InterEntityParent 父级
}public aspect InterEntityAspect {interface InterEntityAspectInterface {void show();}private int InterEntity.x = 99; // InterEntity 中已存在x,但这里定义private并不会冲突String InterEntity.defaultVal = "InterEntityAspect定义的属性"; // 在当前切面所在包下的任何切面或类可以访问declare parents: InterEntity implements InterEntityAspectInterface; // 在InterEntity中或者切面中必须为其实现show方法,否则编译错误declare parents: InterEntity extends InterEntityParent; // 让InterEntity继承InterEntityParentpublic InterEntity.new(int num1) { // 定义InterEntity 构造器this.setX(num1); // this 指的是InterEntity的实例}}public aspect InterEntityAspect2 {public void InterEntity.show() { // 为InterEntity定义show方法System.out.println(this + ".x:" + this.getX());System.out.println("同时可以访问到同包下,为该类定义的default访问类型变量:" + this.defaultVal);}
}

3 thisEnclosingJoinPointStaticPart

封闭连接点的静态部分。不是当前连接点,是封闭连接点。可以使用这个来打印出调用的原位置。

public class EnclosingJoinPointEntity {public void fun1() { // enclosePoint 连接点的封闭节点System.out.println("fun1");System.out.println("---");fun2(); // enclosePoint 的连接点}public void fun2() {System.out.println("fun2");System.out.println("---");}public static void main(String[] args) {EnclosingJoinPointEntity entity = new EnclosingJoinPointEntity();entity.fun1();}
}public aspect EnclosingJoinPointEntityAspect {pointcut enclosePoint(): call(* article.service.EnclosingJoinPointEntity.fun2(..));before(): enclosePoint() {System.out.println("thisJoinPoint");System.out.println(thisJoinPoint);System.out.println(thisJoinPoint.getSourceLocation());System.out.println("--------------");System.out.println("thisEnclosingJoinPointStaticPart");System.out.println(thisEnclosingJoinPointStaticPart);System.out.println(thisEnclosingJoinPointStaticPart.getSourceLocation());System.out.println();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 字符串哈希 || 字符串前缀哈希法

字符串Hash就是构造一个数字使之唯一代表一个字符串。但是为了将映射关系进行一一对应,也就是,一个字符串对应一个数字,那么一个数字也对应一个字符串。 用字符串Hash的目的是,我们如果要比较一个字符串,我们不用直接比…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败

文章目录 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败190.1 服务启动失败190.1.1 问题现象190.1.2 原因分析190.1.3 处理办法 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败 190.1 服务启动失败 190.1.1 问题现…

【Leetcode】251.展开二维向量

一、题目 1、题目描述 请设计并实现一个能够展开二维向量的迭代器。该迭代器需要支持 next 和 hasNext 两种操作。 示例: Vector2D iterator = new Vector2D([[1, 2], [3], [4]]);iterator.next(); //返回1 iterator.next(); //返回2 iterator.next(); //返回3 iterator.h…

Copilot 插件的使用介绍:如何快速上手

GitHub Copilot 本文主要介绍如何通过脚本工具激活 GitHub Copilot 插件,提供安装及激活图文教程,大家按下面操作即可激活GitHub Copilot插件,免费使用Ai编码工具 一、GitHub Copilot 介绍 GitHub Copilot 是由 GitHub 和 OpenAI 共同开发的…

告别冗余空白,批量删除空白行

你是否遇到过这样的尴尬情况:花费了大量时间整理的文档,却在最后发现其中充斥着无用的空白行,这些多余的空行不仅影响美观,还让整个文档显得杂乱无章。今天,我要给大家介绍一款强大且实用的工具——首助编辑高手&#…

移动端对大批量图片加载的优化方法(三)

移动端对大批量图片加载的优化方法(三)Flutter 本篇主要从Flutter开发中可以使用到的对大批量图片加载的优化方法进行整理。 1.合适的图片格式 详情请参考移动端对大批量图片加载的优化方法(一)。 2.缓存机制 在Flutter中&am…

浅谈对Promise的理解。

一、Promise定义 JS中用于处理异步操作的编程模式。一个Promise是一个代理,它代表一个创建Promise时不一定已知的值。它允许我们将处理的程序与异步操作的最终成功值或失败值原因想关联起来。这使得异步方法可以像同步方法一样返回值:异步方法不会立即返…

uniapp最简单的底部兼容安全区域显示

效果图&#xff1a; 1.html写上动态padding-bottom <view class"button-wrap" :style"padding-bottom:bottomPaddingrpx"><view class"com-btn cencel-btn">取消</view><view class"com-btn confirm-btn " cl…

神经网络中的梯度爆炸

梯度爆炸是深度学习中的一种常见问题&#xff0c;指的是在反向传播过程中&#xff0c;某些梯度的值变得非常大&#xff0c;导致数值溢出或趋近于无穷大。梯度爆炸通常会导致训练不稳定&#xff0c;模型无法收敛&#xff0c;或者产生不可靠的结果。 梯度爆炸可能发生在深度神经…

【PostgreSQL创建索引的锁分析和使用注意】

1.1 创建普通B-tree索引的整体流程 如下是梳理的创建普通B-tree索引的大概流程&#xff0c;可供参考。 1.校验新索引的Catalog元数据|语法解析 ---将创建索引的sql解析成IndexStmt结构&#xff5c;校验B-Tree的handler -----校验内核是否支持该类型的索引,在pg_am中查找&q…

java 体育明星管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 体育明星管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

Clojure 实战(4):编写 Hadoop MapReduce 脚本

Hadoop简介 众所周知&#xff0c;我们已经进入了大数据时代&#xff0c;每天都有PB级的数据需要处理、分析&#xff0c;从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目&#xff0c;受Google两篇论文的启发&#xff0c;采用分布式的文件…

Spark Core--加强

RDD的持久化 RDD缓存 当RDD被重复使用&#xff0c;或者计算该RDD比较容易出错&#xff0c;而且需要消耗比较多的资源和时间的时候&#xff0c;我们就可以将该RDD缓存起来。 主要作用: 提升Spark程序的计算效率 注意事项: RDD的缓存可以存储在内存或者是磁盘上&#xff0c;甚至…

小程序开发之uniapp项目框架搭建

出于对技术的实践&#xff0c;以及博主最近刚刚拥有了一台自己的云服务器&#xff0c;本着闲着也是闲着的态度&#xff0c;准备着手开发一款快递下单、查询快艇实时状态的多端小程序&#xff0c;又不想在各个小程序平台重复开发&#xff0c;因此选择了uinapp 。 博主先讲诉一下…

【数据结构】二叉树链式结构详解

目录 1.前言2.快速创建一颗二叉树3.二叉树的遍历3.1前序遍历3.2中序遍历3.3后序遍历3.4层序遍历 4.二叉树节点个数与高度4.1二叉树节点个数4.2二叉树叶子节点个数4.3二叉树高度4.4二叉树第k层节点个数4.5二叉树查找值为x的节点 5.二叉树的基础oj题练习6.二叉树的创建和销毁6.1通…

贪心算法的“左最优“与“右最优“

1 答疑 1.1 什么是贪心算法的"左最优"与"右最优" "左最优"和"右最优"是贪心算法中的两种策略&#xff1a; 左最优 (Leftmost Greedy): 在每一步选择中&#xff0c;总是选择最左边&#xff08;最早出现的&#xff09;可行的选项。 右…

JVM,JRE,JDK的区别和联系简洁版

先看图 利用JDK&#xff08;调用JAVA API&#xff09;开发JAVA程序后&#xff0c;通过JDK中的编译程序&#xff08;javac&#xff09;将我们的文本java文件编译成JAVA字节码&#xff0c;在JRE上运行这些JAVA字节码&#xff0c;JVM解析这些字节码&#xff0c;映射到CPU指令集或…

洛谷——P1069 [NOIP2009 普及组] 细胞分裂(分解质因数,唯一分解定理)

文章目录 一、题目[NOIP2009 普及组] 细胞分裂题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 二、题解1.基本思路&#xff1a;2.代码&#xff1a; 一、题目 [NOIP2009 普及组] 细胞分裂 题目描述 Hanks 博士是 BT&#xff08;…

粒子群算法优化支持向量SVM的供热量预测,粒子群优化支持向量机SVM回归分析

目录 背影 支持向量机SVM的详细原理 SVM的定义 SVM理论 粒子群算法原理 SVM应用实例,粒子群算法优化支持向量SVM的供热量预测,粒子群优化支持向量机SVM回归分析 代码 结果分析 展望 完整代码:粒子群算法优化支持向量SVM的供热量预测,粒子群优化支持向量机SVM回归分析_lssv…