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