天天看點

關于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();
    }