切面配置类,获取切面上的各种属性:
示例
@Aspect
@Component
public class ProceedingJoinPointDemo {
@Pointcut("execution(public * com.demo.controller.*.*.*(..))")
public void allControllerMethod() {
}
@SuppressWarnings("rawtypes")
@Around("allControllerMethod()")
public Object aroundMethod(ProceedingJoinPoint point) throws Throwable {
//拦截的实体类
Object target = point.getTarget();
//拦截的方法名称
String methodName = point.getSignature().getName();
//拦截的方法参数
Object[] args = point.getArgs();
//拦截的放参数类型
Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();
Method m = null;
try {
//通过反射获得拦截的method
m = target.getClass().getMethod(methodName, parameterTypes);
//如果是桥则要获得实际拦截的method
if(m.isBridge()){
for(int i = 0; i < args.length; i++){
//获得泛型类型
Class genClazz = GenericsUtils.getSuperClassGenricType(target.getClass());
//根据实际参数类型替换parameterType中的类型
if(args[i].getClass().isAssignableFrom(genClazz)){
parameterTypes[i] = genClazz;
}
}
//获得parameterType参数类型的方法
m = target.getClass().getMethod(methodName, parameterTypes);
}
//放参数
Integer userId = shiroSessionService.getUserId();
Integer ownerCode = shiroSessionService.getOwnerCode();
String userName = shiroSessionService.getUserName();
Integer userType = shiroSessionService.getRoleId();
String partnerId = shiroSessionService.getPartnerId();
AdminUserVo userVo = new AdminUserVo();
userVo.setUserId(userId);
userVo.setOwnerCode(ownerCode);
userVo.setAdminUsername(userName);
userVo.setUserType(userType);
userVo.setPartnerId(partnerId);
args[1] = userVo;
Object proceed = point.proceed(args);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return proceed;
}
}