在使用aop切面时,如何获取参数信息
获取jdk自带对象
@Around(value = "@annotation(***)")
public Object process(ProceedingJoinPoint joinPoint) throws Throwable {
Method method = this.getMethod(joinPoint);
if (method == null) {
joinPoint.proceed();
}
Map<String, Object> placeholder = new HashMap(16);
Parameter[] parameters = method.getParameters();
Object[] parameterValues = joinPoint.getArgs();
if (parameters != null && parameters.length > 0) {
for (int i = 0; i < parameters.length; ++i) {
Map<String, Object> subPlaceholder = this.getAttrs(parameters[i], parameterValues[i]);
placeholder.putAll(subPlaceholder);
}
}
//3、代码执行
return joinPoint.proceed();
}
/**
* 获取方法
*
* @param joinPoint
*
* @return
*/
private Method getMethod(ProceedingJoinPoint joinPoint) {
Signature signature = joinPoint.getSignature();
if (!(signature instanceof MethodSignature)) {
log.error("不支持的类型,{},期望:MethodSignature,发现:{}", joinPoint.getTarget().getClass().getName(), signature.toShortString());
return null;
} else {
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
return method;
}
}
/**
* 获取参数
*
* @param parameter
* @param value
*
* @return
*/
private Map<String, Object> getAttrs(Parameter parameter, Object value) {
Map<String, Object> subPlaceholder = new HashMap<>();
if (parameter.getType().getClassLoader() == null) {
subPlaceholder = this.getOwnAttrs(parameter, value);
} else {
subPlaceholder = this.getObjAttrs(value);
}
return subPlaceholder;
}
/**
* 获取jdk自带类型的参数
*
* @param parameter
* @param value
*
* @return
*/
private Map<String, Object> getOwnAttrs(Parameter parameter, Object value) {
Map<String, Object> subPlaceholder = new HashMap<>();
if (value instanceof Integer || value instanceof Long
|| value instanceof Short || value instanceof Float
|| value instanceof Byte || value instanceof String
|| value instanceof Boolean || value instanceof Double) {
subPlaceholder.put(parameter.getName(), value);
return subPlaceholder;
}
if (value instanceof Map) {
subPlaceholder.putAll((Map<? extends String, ?>) value);
return subPlaceholder;
}
log.error("参数类型不支持 type:{}", parameter.getType().getName());
return subPlaceholder;
}
/**
* 获取自定义类型的参数
*
* @param object
*
* @return
*/
private Map<String, Object> getObjAttrs(Object object) {
Map<String, Object> placeHolder = new HashMap(16);
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length != 0) {
Field[] var5 = fields;
int var6 = fields.length;
for (int var7 = 0; var7 < var6; ++var7) {
Field field = var5[var7];
try {
field.setAccessible(true);
Object value = field.get(object);
if (value != null) {
placeHolder.put(field.getName(), value);
}
} catch (Exception var11) {
log.warn("读取属性失败", var11);
}
}
return placeHolder;
} else {
return placeHolder;
}
}
上面的方法对于jdk自带的类型,只是处理了8种基础类型和包装类,还有Map类型,其他的都没有处理,如果需要的话进行自动扩展即可。
这里就可以获取到所有的属性和属性值,为业务处理提供支持。