Как получить значение аргумента метода через отражение в Java? - PullRequest
9 голосов
/ 29 августа 2011

Рассмотрим этот код:

public void example(String s, int i, @Foo Bar bar) {
    /* ... */
}

Меня интересует значение аргумента, помеченного @Foo. Предположим, что я уже выяснил посредством отражения (с Method#getParameterAnnotations()), какой параметр метода имеет аннотацию @Foo. (Я знаю, что это третий параметр в списке параметров.)

Как теперь получить значение bar для дальнейшего использования?

1 Ответ

13 голосов
/ 29 августа 2011

Вы не можете.У Reflection нет доступа к локальным переменным, включая параметры метода.

Если вы хотите эту функцию, вам необходимо перехватить вызов метода, что можно сделать одним из следующих способов:

  • AOP (AspectJ / Spring AOP и т. Д.)
  • Прокси (JDK, CGLib и т. Д.)

Во всех этих случаях вы собираете параметры из вызова метода и затем сообщаетевызов метода для выполнения.Но нет способа получить доступ к параметрам метода посредством отражения.

Обновление: вот пример аспекта, который поможет вам начать использовать проверку на основе аннотаций с AspectJ

public aspect ValidationAspect {

    pointcut serviceMethodCall() : execution(public * com.yourcompany.**.*(..));

    Object around(final Object[] args) : serviceMethodCall() && args(args){
        Signature signature = thisJoinPointStaticPart.getSignature();
        if(signature instanceof MethodSignature){
            MethodSignature ms = (MethodSignature) signature;
            Method method = ms.getMethod();
            Annotation[][] parameterAnnotations = 
                method.getParameterAnnotations();
            String[] parameterNames = ms.getParameterNames();
            for(int i = 0; i < parameterAnnotations.length; i++){
                Annotation[] annotations = parameterAnnotations[i];
                validateParameter(parameterNames[i], args[i],annotations);
            }
        }
        return proceed(args);
    }

    private void validateParameter(String paramName, Object object,
        Annotation[] annotations){

        // validate object against the annotations
        // throw a RuntimeException if validation fails
    }

}
...