2013-11-25 12 views
21

Così ho un codice:Ottenere valore di un parametro di un'annotazione in Java

@Path("/foo") 
public class Hello { 

@GET 
@Produces("text/html") 
public String getHtml(@Context Request request, @Context HttpServletRequest requestss){ 
    ... 
} 

Sto usando AspectJ per catturare tutte le chiamate verso getHtml metodo. Vorrei ottenere i parametri passati a @Produces e a @Path nel mio consiglio, ad esempio "/foo" e "text/html" in questo caso. Come posso farlo usando la riflessione?

risposta

27

Per ottenere il valore del parametro @Path:

String path = Hello.class.getAnnotation(Path.class).value(); 

Allo stesso modo, una volta in possesso di MethodgetHtml

Method m = Hello.class.getMethod("getHtml", ..); 
String mime = m.getAnnotation(Produces.class).value; 
+2

Ok, quindi il primo esempio è ok ma c'è '.value()' not '.value'. Il secondo non funziona poiché la classe Annotation non ha un metodo 'value()'. – Darek

+2

il secondo funziona ma come @Vash ha mostrato: MethodSignature ms = (MethodSignature) pjp.getSignature(); Metodo m = ms.getMethod(); Produce pro = m.getAnnotation (Produces.class); – Darek

+0

come posso ottenere @Annotation (param1 = "One", param2 = "THIS")? –

4

L'annotazione è basato sulla logica di interfaccia. È necessario chiamare il membro valido di esso per recuperare il valore.

Definizione

public @interface Produces { 
String type(); 
} 

Leggi esempio

for (Method m: SomeClass.class.getMethods() { 
    Produces produce = m.getAnnotation(Produces.class); 
    if (produce != null) 
     System.out.println(produce.type()); 
} 

Sì. È necessario utilizzare la riflessione per accedere alla definizione del metodo. È possibile utilizzare Class#MgetMethods() per ottenere la definizione di metodo

Per oggetto si chiama obj.getClass() per ottenere la definizione della classe.

Problemi correlati