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