2013-11-25 11 views
21

Also habe ich einen Code bekam:Erhalten Wert eines Parameters einer Anmerkung in Java

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

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

Ich bin mit AspectJ alle Anrufe getHtml Methode zu fangen. Ich möchte in diesem Fall Parameter erhalten, die an @Produces und an @Path in meinem Rat, d. H. "/foo" und "text/html" übergeben werden. Wie kann ich es mit Reflektion machen?

Antwort

27

Um Wert des @Path Parameter zu erhalten:

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

Ähnlich Sobald Sie halten MethodgetHtml

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

Ok, also das erste Beispiel ist in Ordnung, aber es gibt '.value()' nicht '.value'. Der zweite funktioniert nicht, da die Annotation-Klasse keine 'value()' -Methode hat. – Darek

+2

der zweite funktioniert aber als @Vash zeigte: MethodSignature ms = (MethodSignature) pjp.getSignature(); Methode m = ms.getMethod(); Produziert pro = m.getAnnotation (Produces.class); – Darek

+0

Wie bekomme ich @Annotation (param1 = "One", param2 = "THIS")? –

4

haben Die Anmerkung auf Interface-Logik basiert. Sie müssen das gültige Mitglied aufrufen, um den Wert abzurufen.

Definition

public @interface Produces { 
String type(); 
} 

lesen Beispiel

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

Ja. Sie müssen die Reflektion verwenden, um auf die Methodendefinition zuzugreifen. Sie können Class#MgetMethods() verwenden, um die Definition der Methode

zu erhalten. Für Objekt rufen Sie obj.getClass(), um die Klassendefinition zu erhalten.

Verwandte Themen