2013-08-08 18 views
5

Czy jest możliwe uzyskanie wartości parametru, jeśli adnotacja jest obecna w tym parametrze?Uzyskaj wartość parametru, jeśli istnieje adnotacja parametru

Biorąc EJB z adnotacjami parametr szczebla:

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

i przechwytujących:

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

Odpowiedz

4

w twojej doIntercept() można pobierać metoda miano od InvocationContext i uzyskać 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]); 

Ponieważ Annotation[][] zwraca pustą tablicę 2nd wymiaru, jeśli nie ma adnotacji, wiesz który parametr pozycje mają adnotacje. Następnie możesz zadzwonić pod numer InvocationContext#getParameters(), aby uzyskać Object[] z wartościami wszystkich przekazanych parametrów. Rozmiar tej tablicy i Annotation[][] będzie taki sam. Po prostu zwróć wartość indeksów, w których nie ma adnotacji.

+0

To da mi tylko adnotacje o parametrach. Potrzebuję wartości parametru, biorąc pod uwagę obecną adnotację. – user2664820

+0

Nie do końca tego, czego szukam. Nie próbuję pobierać żadnych atrybutów z adnotacji Foo. Raczej chcę wartości parametrów. W powyższym przykładzie chcę wartości argumentów a i c. – user2664820

+0

@ user2664820 Tak, właśnie zaktualizowany. 'Method.getParameterAnnotations();' powie Ci, które pozycje i 'context.getParameters()' dadzą ci wartość –

1

Można spróbować coś takiego

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

można spróbować coś takiego, mam zdefiniować adnotacji Param nazwie MyAnnotation i pojawia się adnotacja Param w ten sposób. To działa.

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

Powinieneś podać kilka informacji, dlaczego twój kod rozwiązuje problem. Proszę spojrzeć na [odpowiedź] – JimHawkins

+0

@JimHawkins Dzięki za wskazówki. To jest mój pierwszy raz odpowiedzieć i nie wiedziałem, że. Dzięki! – franlisa

Powiązane problemy