在SpringAOP中如何獲取方法的引數值(實體類)以及引數名
阿新 • • 發佈:2019-02-02
廢話不多說直接上程式碼 引數對了效果就可以出來 返回值是一個map key 是引數名稱 value 是引數值,
private static Map getFieldsName(ProceedingJoinPoint joinPoint) throws ClassNotFoundException, NoSuchMethodException { String classType = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); // 引數值 Object[] args = joinPoint.getArgs(); Class<?>[] classes = new Class[args.length]; for (int k = 0; k < args.length; k++) { if (!args[k].getClass().isPrimitive()) { // 獲取的是封裝型別而不是基礎型別 String result = args[k].getClass().getName(); Class s = map.get(result); classes[k] = s == null ? args[k].getClass() : s; } } ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer(); // 獲取指定的方法,第二個引數可以不傳,但是為了防止有過載的現象,還是需要傳入引數的型別 Method method = Class.forName(classType).getMethod(methodName, classes); // 引數名 String[] parameterNames = pnd.getParameterNames(method); // 通過map封裝引數和引數值 HashMap<String, Object> paramMap = new HashMap(); for (int i = 0; i < parameterNames.length; i++) { paramMap.put(parameterNames[i], args[i]); } return paramMap; } private static HashMap<String, Class> map = new HashMap<String, Class>() { { put("java.lang.Integer", int.class); put("java.lang.Double", double.class); put("java.lang.Float", float.class); put("java.lang.Long", long.class); put("java.lang.Short", short.class); put("java.lang.Boolean", boolean.class); put("java.lang.Char", char.class); } };