В общем, как получить «параметр типа» параметра рекомендуемого метода

С помощью Spring AOP я пишу аспект с советом вокруг, который перехватывает любой метод, аннотированный @MyAnnotation. Предположим, что перехваченный метод был объявлен следующим образом:

@MyAnnotation
public String someMethod(ArrayList<Integer> arrList) {...}

В методе совета я хочу получить информацию о том, что первый параметр, то есть arrList, имеет тип ArrayList с параметром типа Integer.

Я попытался выполнить этот вопрос, выполнив это

@Around("@annotation(MyAnnotation)")
public Object advice(ProceedingJoinPoint pjp) {
    Method method = ((MethodSignature) pjp.getSignature()).getMethod();
    Class<?>[] paramsClass = method.getParameterTypes();
    logger.info(((ParameterizedType) paramsClass[0].getGenericSuperclass()).getActualTypeArguments()[0])
    ...
}

Но то, что было выведено из системы, это просто E. Как мне сделать, чтобы он печатал java.lang.Integer?


person asinkxcoswt    schedule 22.04.2014    source источник
comment
См. этот комментарий: stackoverflow.com/questions/19860393/   -  person Andrei Stefan    schedule 22.04.2014


Ответы (1)


Попробуй это:

@Around("@annotation(MyAnnotation)")
public Object advice(ProceedingJoinPoint pjp) throws Throwable {
    Method method = ((MethodSignature) pjp.getSignature()).getMethod();
    Type[] genericParamsClass = method.getGenericParameterTypes();

    logger.info(((ParameterizedType) genericParamsClass[0]).getActualTypeArguments()[0]);
    ...
}
person Andrei Stefan    schedule 22.04.2014
comment
Если у вас есть время, объясните, что именно возвращает method.getGenericParameterTypes(). Я попытался выяснить, в чем разница между class и type, и, насколько я понимаю, type является обобщением class, а другие type - это interface, array и primitive. Но я не могу понять, какой тип type, возвращаемый method.getGenericParameterTypes(), может иметь информацию о том, что общий параметр равен java.lang.Integer. Спасибо. - person asinkxcoswt; 22.04.2014
comment
stackoverflow.com/questions/6747383/ - person Andrei Stefan; 22.04.2014