在使用aop切面时,如何获取参数信息
在使用aop切面时,如何获取参数信息
获取jdk自带对象
@Around(value = "@annotation(***)")public Object process(ProceedingJoinPoint joinPoint) throws Throwable {Method method = this.getMethod(joinPoint);if (method == null) {joinPoint.proceed();}Map 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 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 getAttrs(Parameter parameter, Object value) {Map 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 getOwnAttrs(Parameter parameter, Object value) {Map 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 getObjAttrs(Object object) {Map 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类型,其他的都没有处理,如果需要的话进行自动扩展即可。
这里就可以获取到所有的属性和属性值,为业务处理提供支持。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
