2013-08-08 3 views
5

Возможно ли получить значение параметра, если аннотация присутствует в этом параметре?Получить значение параметра, если существует аннотация параметра

Учитывая EJB с аннотациями параметров уровня:

public void fooBar(@Foo String a, String b, @Foo String c) {...} 

И перехватчик:

@AroundInvoke 
public Object doIntercept(InvocationContext context) throws Exception { 
    // Get value of parameters that have annotation @Foo 
} 

ответ

4

В вашей doIntercept() вы можете получить метод вызывается из InvocationContext и получить parameter annotations.

Method method = context.getMethod(); 
Annotation[][] annotations = method.getParameterAnnotations(); 
// iterate through annotations and check 
Object[] parameterValues = context.getParameters(); 

// check if annotation exists at each index 
if (annotation[0].length > 0 /* and if the annotation is the type you want */) 
    // get the value of the parameter 
    System.out.println(parameterValues[0]); 

Поскольку Annotation[][] возвращает пустой массив 2-го размера, если нет аннотаций, вы знаете, какой параметр позиции имеют аннотации. Затем вы можете позвонить InvocationContext#getParameters(), чтобы получить Object[] со значениями всех переданных параметров. Размер этого массива и Annotation[][] будет таким же. Просто верните значение индексов, где нет аннотаций.

+0

Это даст мне только аннотации к параметрам. Мне нужно значение параметра, если присутствует аннотация. – user2664820

+0

Не совсем то, что я ищу. Я не пытаюсь получить какие-либо атрибуты в аннотации Foo. Скорее, мне нужны значения параметров. В моем примере выше я хочу значения аргументов a и c. – user2664820

+0

@ user2664820 Да, просто обновлено. 'Method.getParameterAnnotations();' скажет вам, какие позиции и 'context.getParameters()' выдаст вам значение –

1

Вы можете попробовать что-то вроде этого

Method m = context.getMethod(); 
    Object[] params = context.getParameters(); 
    Annotation[][] a = m.getParameterAnnotations(); 
    for(int i = 0; i < a.length; i++) { 
     if (a[i].length > 0) { 
      // this param has annotation(s) 
     } 
    } 
2

Вы можете попробовать что-то вроде этого, я определяю аннотацию Param имени MyAnnotation и я получаю аннотацию Param таким образом. Оно работает.

Annotation[][] parameterAnnotations = method.getParameterAnnotations(); 
Class[] parameterTypes = method.getParameterTypes(); 

int i=0; 
for(Annotation[] annotations : parameterAnnotations){ 
    Class parameterType = parameterTypes[i++]; 

    for(Annotation annotation : annotations){ 
    if(annotation instanceof MyAnnotation){ 
     MyAnnotation myAnnotation = (MyAnnotation) annotation; 
     System.out.println("param: " + parameterType.getName()); 
     System.out.println("value: " + myAnnotation.value()); 
    } 
    } 
} 
+1

. Вы должны предоставить некоторую информацию, почему ваш код решает проблему. Пожалуйста, посмотрите [ответить] – JimHawkins

+0

@ JimHawkins Спасибо за ваши советы. Это мой первый ответ, и я этого не знал. Благодаря! – franlisa

Смежные вопросы