天天看点

关于aop环切方法中几种获取切面方法上Annotation注解的区别

@Pointcut("@annotation(com.sun.simpledemo.lock.DistributedLock)")
    public void pointcut() {

    }

    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        //1.获取切入点所在目标对象
        Object targetObj = joinPoint.getTarget();
        System.out.println("切入类名字:" + targetObj.getClass().getName());
        // 2.获取切入点方法的名字
        String methodName = joinPoint.getSignature().getName();
        System.out.println("切入方法名字:"+methodName);
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        System.out.println("切入方法名字:"+ methodSignature.getName());
        System.out.println("切入方法名字:"+ methodSignature.getMethod().getName());
        Class[] parameterTypes = methodSignature.getParameterTypes();
        System.out.println("切入方法入参类型:" + parameterTypes);
        /**
         * 获取方法上的注解
         * getDeclaredMethod可以获取任意方法,像protected修饰的
         * getMethod 只可以获取 修饰符为 public 的方法
         */
        //方式一,只支持cglib代理
        DistributedLock distributedLock = AnnotationUtils.findAnnotation(methodSignature.getMethod(), DistributedLock.class);
        System.out.println("切入方法的注释:" + (distributedLock != null ? distributedLock.expiration() : ""));
        //方式二,只支持cglib代理
        DistributedLock distributedLock1 = AnnotationUtils.getAnnotation(methodSignature.getMethod(), DistributedLock.class);
        System.out.println("切入方法的注释:" + (distributedLock1 != null ? distributedLock1.expiration() : ""));
        //方式三,只支持cglib代理
        Method method = methodSignature.getMethod();
        DistributedLock distributedLock2 = method.getAnnotation(DistributedLock.class);
        System.out.println("切入方法的注释:" + (distributedLock2 != null ? distributedLock2.expiration() : ""));
        //方式四,同时支持jdk代理和cglib代理
        DistributedLock distributedLock3 = targetObj
                .getClass()
                .getDeclaredMethod(methodSignature.getMethod().getName(), methodSignature.getParameterTypes())
                .getAnnotation(DistributedLock.class);
        System.out.println("切入方法的注释:" + (distributedLock3 != null ? distributedLock3.expiration() : ""));

        //4. 获取方法的参数
        Object[] args = joinPoint.getArgs();
        for(Object o :args){
            System.out.println("切入方法的参数:"+o);
        }
        return joinPoint.proceed();
    }