2013-08-08 16 views
5

È possibile ottenere il valore di un parametro se è presente un'annotazione su quel parametro?Ottieni valore parametro se esiste annotazione parametro

EJB Dato con annotazioni a livello di parametri:

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

E un intercettore:

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

risposta

4

Nel vostro doIntercept() è possibile recuperare il metodo viene chiamato dal InvocationContext e ottenere il 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]); 

Poiché il Annotation[][] restituisce un array di 2 ° dimensione vuota se non ci sono annotazioni, si sa che le posizioni dei parametri hanno le annotazioni. È quindi possibile chiamare InvocationContext#getParameters() per ottenere un Object[] con i valori di tutti i parametri passati. La dimensione di questo array e lo Annotation[][] saranno uguali. Basta restituire il valore degli indici dove non ci sono annotazioni.

+0

Questo mi darà solo le annotazioni presenti sui parametri. Quello di cui ho bisogno è il valore del parametro data l'annotazione è presente. – user2664820

+0

Non proprio quello che sto cercando. Non sto cercando di recuperare alcun attributo sull'annotazione Foo. Piuttosto, voglio i valori dei parametri. Nel mio esempio sopra, voglio i valori degli argomenti a e c. – user2664820

+0

@ user2664820 Sì, appena aggiornato. 'Method.getParameterAnnotations();' ti dirà quali posizioni e 'context.getParameters()' ti darà il valore –

1

si può provare qualcosa di simile

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

Si può provare qualcosa di simile, mi definisco un'annotazione Param nome MyAnnotation e ottengo l'annotazione Param in questo modo. Funziona.

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

Dovresti fornire alcune informazioni sul perché il tuo codice risolve il problema. Per favore guarda [risposta] – JimHawkins

+0

@JimHawkins Grazie per i tuoi suggerimenti. Questa è la prima volta che rispondo e non lo sapevo. Grazie! – franlisa