AspectJ

Android AspectJ详解 作者2013年从java开发,转做Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。参与过不少面试,也当面试官 面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!我整理了一份阿里P7级别的最系统的Android开发主流技术,特别适合有3-5年以上经验的小伙伴深入学习提升。主要包括阿里,以及字节跳动,腾讯,华为,小米,等一线互联网公司主流架构技术。 阅读详情

        让我好好想想, AspectJ 中最常用的切入点是什么?哦,也许是 call ( Method-Signature )吧。这是个相对简单的方法签名。实际上,方法签名的完整形式如下:

[modifiers] [returnTypePattern] [DeclaredTypePattern.]methodName([Parameters])[throws TypePattern] ,其中方括号中的签名组件是可选的。 modifiers 为修饰符模式, returnTypePattern 为返回类型模式, DeclaredTypePattern 为类型声明模式, methodName 为方法名称, Parameters 为方法参数, throws TypePattern 为 throw 字句。该文仅仅介绍 DeclaredTypePattern ,因为相比之下其它模式比较简单的多。

        在介绍类型声明模式之前,介绍一下类型模式。类型模式是匹配一种类型或一系列类型的方法。精确的类型模式是如 java.lang.String 一样的完整的有效类型名。但在使用 AspectJ 类型模式时,经常会用到下列通配符(这些通配符同样适用于 Spring 的 AOP )。

1 )“ *” :代表任意字符的零次或多次出现。当嵌入到一串字符的内部时,它匹配任意字符的零次或多次出现,除了包分割符( . )。

2 )“ +” :用作类型模式的后缀,代表此类型和其所有的子类型(那些扩展或实现带后缀类型的类型)。

3 )“ ..” :用于指定所有的子包,它匹配任意以包分割符开头和结束的字符串。
 

下面给出几个示例:

1 ) *Account 使用 Account 名称结束的类型,如 CheckingAccount
2
) java.*.Date 类型 Date 在任何直接的 java 子包中,如 java.util.Date 和 java.sql.Date
3
) java..* 任何在 java 包或者所有子包中的类型,如 java.awt 或者 java.awt.event
4
) javax..*Model+ 所有 javax 包或者子包中以 Model 结尾的类型和其所有子类,如 TableModel,TreeModel 。

 

        现在开始说说类型声明模式。实际上,在方法签名中,类型声明模式不是必需的(就像很多书中所说,应该少用类型声明模式而改用与“ target” 结合的切入点指示符)。但如果指定了类型声明模式,切入点将只匹配对由模式匹配的类型(或者超类型)声明的方法的调用。和其他类型模式一样,类型声明模式支持上述的通配符。同时,它也支持复合类型模式。对于类型声明模式来说,程序员容易犯错的地方在于类型声明模式是基于静态类型而不是运行时类型,这也是本文的主要内容。

    

在很好地理解类型声明模式之前,先看一下下面的例子:

 

 

 

        它的运行结果是这样的:
        B.foo()

        Call A

 

 

        和你的想法一致吗?对于( 1 )处 b.foo() 的调用应用了面向对象中的覆盖( override ),它是动态的,是在运行时进行解析。而( 2 )处的 callFoo (b) 则是重载( overload ),它是静态的,是在编译时解析的。因此,对于变量 b ,虽然它是 B 的一个实例,但 b 的静态类型(也就是变量声明的类型)是 A ;由于重载方法的选择是静态的,所以 main 中调用的是 callFoo(A a) ,而不是 callFoo(B b) 。

        终于说到了类型声明模式。类型声明模式是基于静态类型信息进行匹配的,而不是动态(或者运行时。下面根据几个典型的例子说明类型声明模式的特性。

        还是上面的两个类 A 和 B ,现在我们定义一个方面如下:


 

        main 函数内容如下:


 

      

运行结果如下:

call A

B.foo()

call A

B.foo()

 

        可以看到,尽管切入点 callA() 声明的类型为 A ,但实际上,切入点 callA() 可以捕获 A 中的方法及其子类中继承于 A 的方法或重载 A 的方法,而声明的静态类型既可以是 A 也可以是其子类。

        但如果在 B 中增加一个新的方法:

public   void  doAnotherThing(){

System.out.println(
" B.doAnotherThing " );

}

        main 函数改为:

public   static   void  main(String[] args) {

B b2 
=   new  B();

b2.doAnotherThing();

}

       输出结果为: B.doAnotherThing ,如果想对 A 的子类 B 中扩展的方法进行通知,可采用的方法是将切入点 callA() 改为 pointcut callA(): call (* A+.*(..)); 。

        让我们再来看另一种情景:如果定义一个切入点如下:


 pointcut callB():call( *  B. * (..));

before():callB(){

System.out.println(
" call B " );

}

        main 函数内容如下:


public   static   void  main(String[] args) {

A b 
=   new  B();

b.foo();

}

        运行结果为: B.foo() 。 b.foo() 没有匹配切入点 callB() 的原因在于, b 的静态类型是 A ,从静态类型的角度来看,这是对 A 的调用,而不是对 B 的调用。在使用 AspectJ 的类型声明时,很容易在这个地方犯错。

        好了,如上便是有关类型声明模式的东西,说得有些凌乱,希望对 AspectJ 初学者有些帮助(我本身也是个初学者)。该文参考了《 Eclipse AspectJ 》和《 AspectJ cookbook 》。

 


 

 

public   static   void  main(String[] args) {
        A b1 
=   new  B();
        b1.foo();
        
        B b2 
=   new  B();
        b2.foo();
    }
public  aspect TypeAspect {

        pointcut callA():
            call(
*  A. * (..));
        
        before():callA(){
            System.out.println(
" call A " );
        }    
}
public   class  A  {
    
public   void  foo(){
        System.out.println(
" A.foo() " );
    }
}
public   class  B  extends  A{
    
public   void  foo(){
        System.out.println(
" B.foo() " );
    }
}
public   class  Main {

    
    
public   static   void  main(String[] args) {
        A b 
=   new  B();
        b.foo(); 
// (1)
        callFoo(b); // (2)
    }

    
public   static   void  callFoo(A a){
        System.out.println(
" Call A " );
    }
    
    
public   static   void  callFoo(B b){
        System.out.println(
" Call B " );
    }
}

 
比较Spring AOP和AspectJ 它与我现有的或新的应用程序兼容吗?在哪里可以实施AOP?它与我的应用程序集成的速度有多快?性能开销是多少?在本文中,我们将着眼于回答这些问题,并介绍Spring AOP和AspectJ(这两种最流行的Java AOP框架)。下表概述了Spring AOP和AspectJ之间的主要区别:Spring AOPAspectJImplemented in pure Java-- 用纯Java实现。 阅读详情

相关推荐

转录组分析中的Fastp和FastQC:如何快速检测数据质量并优化流程

本文深入探讨了转录组分析中数据质量控制的核心流程,重点介绍了Fastp和FastQC两款工具的组合应用。FastQC负责对原始测序数据进行全面质量评估,生成可视化报告;Fastp则能一站式完成接头切除、低质量序列过滤、长度筛选等关键质控步骤。文章提供了详细的参数解读、实战脚本和自动化流程构建指南,帮助研究人员快速检测数据质量并优化预处理流程,为下游的差异表达等分析奠定可靠基础。

weixin_28452161的博客 183

AspectJ使用

一、AOP介绍 AOP:Aspect-Oriented Programming,面向切面编程,是一种新的方法论(编程范式),是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充。旨在通过允许横切关注点的分离,提高模块化。如在方法执行前、或执行后、或是在执行中出现异常后这些地方进行拦截处理或叫做增强处理。主要应用于:日志收集、事务管理、安全检查、缓存、对象池管理等。 AOP实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理(例如:sprin

赶路人儿 1万+

DeepSeek助力学术审稿:高效处理审稿意见的实用提示词指南

本文介绍如何利用DeepSeek AI工具高效处理学术审稿意见,提供实用的提示词指南。从评审意见结构化整理到争议问题回应策略,详细解析AI在加速审稿流程中的应用技巧,帮助研究者大幅提升回复效率和质量。

weixin_28684497的博客 597

AspectJ开发

在Spring的配置文件中,切入点是通过元素来定义的。注意:在AOP的配置信息中,使用配置的后置通知和使用配置的最终通知,虽然都是在目标方法执行之后执行的,但它们是有区别的。在Spring的配置文件中,配置切面使用的是元素,该元素会将一个已定义好的Spring Bean转换成切面Bean,所以要在配置文件中先定义一个普通的Spring Bean(如上述代码中定义的myAspect)。

夏天又到了的专栏 1140

ARM CoreSight架构

CoreSight架构是现代复杂SoC的“飞行数据记录仪”(黑匣子)和“精密诊断仪”的结合体。它彻底改变了嵌入式系统的调试方式,从传统的“盲人摸象”变成了拥有“上帝视角”,是ARM生态系统能够支撑起从微控制器到高性能服务器芯片如此广泛产品线的重要基石技术之一。

guigenyi的专栏 1424

FPGA开发中的操作系统

在FPGA开发中,操作系统起着关键的作用,它负责任务管理、资源管理、中断处理和设备驱动程序等功能。在实际的FPGA开发中,可以选择使用现有的操作系统,如MicroC/OS-II、FreeRTOS等,或者根据具体需求自行设计和开发操作系统。在FPGA(可编程逻辑门阵列)开发中,操作系统扮演着关键的角色,为硬件设计师提供了一种有效的方式来管理资源、调度任务并实现系统级功能。本文将介绍FPGA开发中的操作系统概念,并提供一个简单的示例代码来说明如何在FPGA平台上实现一个基本的操作系统。

CqpFsharp的博客 1160

AspectJ 对于 AOP 的实现

介绍了 AspectJ 的相关内容及 spring 引入 AspectJ 后,注解方式和 xml 配置方式的 AOP 实现

iCheetor 876

基于PyTorch+Transformer实现谣言检测系统

本项目使用基于`PyTorch+Transformer`的谣言检测模型,将文本中的谣言事件进行连续向量化,通过一维卷积神经网络的学习训练来挖掘表示文本深层的特征,避免了特征构建的问题,并能发现那些不容易被人发现的特征,从而产生更好的效果。

优快云 精品推荐 6352

AspectJ实现AOP编程

AspectJ实现AOP编程,模拟判断登录需求,获取参数。

qq_30974087的博客 934

2.STM32F407ZGT6 学习笔记-移植 FreeRTOS

1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src 和 port 文件夹 (src用于存放freertos源码,port文件夹存放内存和接口相关的文件) 3. 复制freertos/source文件夹下所有c文件复制到刚刚建立的freertos/src目录下 4. 复制FreeRTOSv9.0.0\FreeRTOS\Source\portablex下的MemMang和RVDS文件夹复制到刚刚建立的port问价夹下 5. 将FreeRTOSv9.0.0\FreeRTOS

Car12 1233

一文搞懂蚁群算法Ant Colony Optimization(ACO)!!!(灵感起源+数学原理+代码实现+实战应用)

本文系统介绍了蚁群算法的原理与实现。首先从蚂蚁觅食行为出发,阐释了信息素正反馈机制如何引导群体找到最短路径。随后详细解析了算法的数学模型,包括状态转移规则和信息素更新机制。通过MATLAB代码演示了算法在旅行商问题(TSP)中的应用,展示了路径构建和优化的完整流程。最后讨论了算法的优势、局限性和实际应用场景。蚁群算法通过模拟生物智能,为解决复杂优化问题提供了一种高效方法,其核心在于信息素的正反馈机制与随机探索的平衡。

qq_42212808的博客 888

spring 中 AspectJ 基于注解的实现分析

从源码角度分析了 spring 引入 AspectJ 之后,基于注解的实现过程

iCheetor 1313

YOLO26全新改进 | 最全损失函数改进篇 | SIoU 、WIoU、GIoU、DIoU、EIOU、CIoU, InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

🔥本文详细介绍了如何修改YOLO26中的损失函数。首先提供了完整的损失函数核心代码,包括WIoU_Scale类和各种IoU计算方法。然后分三步指导修改:1)替换metrics.py中的bbox_iou方法;2)修改loss.py中的iou计算代码;3)更新tal.py中的相关代码。文中特别强调了修改损失函数应在模型结构调整后使用,并提供了多种IoU损失函数的参数配置建议,包括SIoU、WIoU、GIoU等,可根据实际需求灵活选择搭配使用。

Ai缝合怪、助力小伙伴高效发论文 451

AspectJ 解决Spring @Transactional 坑点 步骤记录

上一篇文章提到Spring @Transactional 坑点中的前两个坑点都是用比较常规的方法解决的,spring官方提到过aspectj这种解决方案,随后我花时间研究了一下确实解决了,大概步骤是这样的: 1、pom.xml中加maven依赖: <dependency> <groupId>org.aspectj</groupId> <arti...

oyc619491800的博客 1711

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

AspectJ简介

1.AspectJ简介 AspectJ是一个基于Java语言的AOP框架 Spring2.0以后新增了对AspectJ切点表达式支持 @AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面 新版本Spring框架,建议使用AspectJ方式来开发AOP 主要用途:自定义开发 2.切入点表达式【掌握】 execution() ...

辰小白 9335

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AspectJ 使用及原理

AspectJ 使用及原理一.简介二.原理三.使用(一)基本概念1.连接点(JoinPoint)2.切点(PointCut)3.插入逻辑(Advice)4.切面(Aspect)(二)类型匹配表达式1.注解2.修饰符3.返回值4.类5.方法名6.方法参数7.组合使用(三)切入点组合表达式1.call/execution2.this3.target4.within5.args6.注解支持7.组合使用8...

依生依世 6083

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

AspectJ 中类型的绑定

以示例的方式,从源码角度分析了 AspectJ 切入点表达式中配置类型的绑定过程

iCheetor 849

java aspectj_AspectJ的基本用法

AOP虽然是方法论,但就好像OOP中的Java一样,一些先行者也开发了一套语言来支持AOP。目前用得比较火的就是AspectJ了,它是一种几乎和Java完全一样的语言,而且完全兼容Java(AspectJ应该就是一种扩展Java,但它不是像Groovy[1]那样的拓展。)。当然,除了使用AspectJ特殊的语言外,AspectJ还支持原生的Java,只要加上对应的AspectJ注解就好。所以,使用...

weixin_39644494的博客 1056

springaop和maven中使用aspectj

AOP概念:面向切面编程 目的:扩展功能 实现原理: 一个java类到执行过程需要及经过的流程 .java源码文件--------------->.class字节码文件-------------->loadclass->------->实例化,执行方法 很明显,要想扩展(更改代码)在上面几步里面都可以做到,总体将实现原理分为两类 静态代理分为:编译时织入(比如aspectj的ajc编译)、类加载时织入(自定义类加载器实现)。 动态代理有 : jdk动态代理(基于接口来实现

weixin_43328357的博客 2835

AspectJ without Spring framework

文件放在target\classes\META-INF下, 必须放置, 否则动态加载不生效。1. mvn pom.xml. 开发工具使用jdk18, 本次cmd使用了jkd11。使用runtime weave模式。2. 编写aspectLog。启动即可看到打印的log方法。4. 配置aop.xml。

lianghyan的专栏 941

Spring的aspectj的AOP操作

(1)execution(*com.cn.aop.Book.add(..)) *代表任意修饰符 ..代表任何参数。execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)(4) 匹配所有save开头的方法 execution(*save*(..))1.切入点:实际增强的方法。使用表达式配置切入点。

bishe361的博客 1153

关于AspectJ,你需要知道的一切

前言 本文将介绍与AspectJ以及与其相关的内容,各方面内容的侧重点会有所不同,AspectJ将会进行详细的介绍,而其他方面的内容则重点在于辅助理解AspectJ的原理,便于更好地掌握AspectJ。 在Android中你要使用AspectJ,那么你就要懂得注解,要理解AspectJ的实现你就要懂得APT与动态代理,为什么要使用AspectJ你就要理解AOP与OOP的区别,这些不仅仅是学习A...

whatigame的博客 2083

SpringBoot整合Spring AOP & Aspectj 框架 快速入门

到底什么是AOP,很多小伙伴八股文背的6的一,但是实际业务可能工作两年都没用过。所以来说AOP到底是什么玩意?AOP 是 Aspect Oriented Programming 的缩写,译为面向切向编程。图片来理解:假设我有四个行为:在我所有行为之前我都需要 洗手在我所有行为之后我都需要 上厕所解决办法一:每个方法之前加入 洗手 逻辑, 每个方法之后加入 上厕所 逻辑。解决办法二:抽取出一个公用的 洗手 和 上厕所 方法,然后每个行为之前调用 洗手方法,每个行为之后调用 上厕所方法。

喵小狸的博客 1398
上一篇: Jstl 表达式语言
下一篇: Spring 2 AOP
javaokay
博客等级 码龄20年 6粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值