1. 程式人生 > >在SpringAOP中如何獲取方法的引數值(實體類)以及引數名

在SpringAOP中如何獲取方法的引數值(實體類)以及引數名

 廢話不多說直接上程式碼 引數對了效果就可以出來  返回值是一個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);
        }
    };