AOP实现拦截对象以及获取切入目标方法和注解

一、JoinPoint是什么?

AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用 org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。任何一个增强方法都可以 通过将第一个入参声明为JoinPoint访问到连接点上下文的信息。

二、我们先来了解一下这两个接口的主要方法:

1.JoinPoint 
l java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 
l Signature getSignature() :获取连接点的方法签名对象; 
l java.lang.Object getTarget() :获取连接点所在的目标对象; 
l java.lang.Object getThis() :获取代理对象本身;

2.ProceedingJoinPoint

ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:

java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;

java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:

通过反射执行目标对象连接点处的方法,不过使用新的入参替换原来的入参。

三、再了解一下JoinPoint接口的子接口和实现类:

四、获取切入方法对象三种方法:

1.通过反射机制获取切入点目标类的方法

  1. public void invoke(JoinPoint joinPoint) throws Throwable{
  2. //登录拦截
  3. MethodInvocationProceedingJoinPoint methodPoint = (MethodInvocationProceedingJoinPoint)joinPoint;
  4. Field proxy = methodPoint.getClass().getDeclaredField("methodInvocation");
  5. proxy.setAccessible(true);
  6. ReflectiveMethodInvocation j = (ReflectiveMethodInvocation) proxy.get(methodPoint);
  7. Method method = j.getMethod();
  8. Login login = method.getAnnotation(Login.class);

2.通过JoinPoint的getTarget()获取连接点所在的目标对象

  1. public void invoke(JoinPoint joinPoint) throws Throwable{
  2. //拦截的实体类
  3. Object target = joinPoint.getTarget();
  4. //拦截的方法名称
  5. String methodName = joinPoint.getSignature().getName();
  6. //拦截的方法参数
  7. Object[] argsa = joinPoint.getArgs();
  8. //拦截的放参数类型
  9. Class[] parameterTypes = ((MethodSignature)joinPoint.getSignature()).getMethod().getParameterTypes();
  10. Method method = target.getClass().getMethod(methodName, parameterTypes);
  11. Login login = method.getAnnotation(Login.class);

3.通过JoinPoint的getSignature()获取连接点的方法签名对象

    1. public void invoke(JoinPoint joinPoint) throws Throwable{
    2. MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
    3. Method method = methodSignature.getMethod();
    4. Login login = method.getAnnotation(Login.class);

AOP实现拦截对象以及获取切入目标方法和注解的更多相关文章

  1. [技巧篇]08.Struts2拦截器中获取Servlet API方法

    讲课中遇到的解决Session拦截器的后腿问题,还有如何在拦截器中获取Servlet API,这里留一个备注,方便学生查找

  2. 怎样通过id属性快速从HTMLCollection对象中获取到目标元素节点

    方法1: 直接使用id或name属性: 比如我想获取 id 为 img1 的图片元素节点, 则可以这样写: document.images.img1 如果没有对应节点, 则返回undefined; 方 ...

  3. 拦截器中获取不到controller注解问题

    刚刚在测试接口的时候发现一个奇怪的问题:通过拦截器获取 controller 类注解,有些能获取到,有些又不能获取到,见鬼了. [环境]: 1. springboot :2.2.0.RELEASE [ ...

  4. Spring AOP不拦截从对象内部调用的方法原因

    拦截器的实现原理很简单,就是动态代理,实现AOP机制.当外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作. 但是最近在项目中 ...

  5. spring aop获取目标对象的方法对象(包括方法上的注解)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  6. AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象

    现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...

  7. Spring:使用Spring AOP时,如何获取目标方法上的注解

    当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 package com.agent.annotation; import java.lang.annot ...

  8. 学习spring第6天(aop获取目标方法参数)

    关于<aop:around>中的方法,需要第一个参数为ProceedJoinPoint,在方法体中通过该参数调用proceed()才能使目标方法得到调用. 当一个切面中有多个<aop ...

  9. AOP中ProceedingJoinPoint获取目标方法,参数,注解

    private void saveLog(ProceedingJoinPoint jp,long time)throws Throwable { package com.cy.pj.common.as ...

随机推荐

  1. c3p0 配置文件的设置。解决编码乱码问题等

    <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <named-confi ...

  2. spring boot aop 报错

    1.控制台报错 Pointcut is not well-formed: expecting 'name pattern' at character position 33 execution(com ...

  3. C++基于范围的for循环性能测试(针对std::vector)

    1.代码如下: void output1(int x){ if (x == 10000000) { std::cout << x << std::endl; } }const ...

  4. MVC Helper Methods

    在.net MVC中经常会见到特别的写法 比如 @Url.Action( ) @Url.Conyent( ) @Html.Displayfor( )等等 这些 写法就是我们这里要讲的  Helper ...

  5. NIO学习笔记六:channel 之前数据传输及scatter/gather

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel. FileChannel的transferFrom()方法可以将 ...

  6. javascript中常见错误类型

    js中控制台报错主分两大类: 第一类:语法错误,这一类错误在javascript预解析的过程中如果遇到,则会导致整个js文件都无法执行. 另一类:统称为异常,这一类的错误会导致在错误出现的那一行之后的 ...

  7. SDN架构

    一:网络设备(Network Devices) 二:南向接口(Southbound Interface) 三:控制器(Controllers) 四:北向接口(Northbound Interface) ...

  8. 微信公众号获取acess_token并存储(php)

    <?php define("appid", "你的appid"); define("appsecret", "你的appse ...

  9. Nodejs 使用特定版本的SSL/TLS协议版本

    var options = { key: fs.readFileSync('./bin/privatekey.pem'), cert: fs.readFileSync('./bin/certifica ...

  10. android:screenOrientation属性

    今天工作中发现一个activity的android:screenOrientation属性设置为behind,平时经常看到的是landscape.portrait,一时没有反应过来,故查了一下andr ...