2017-12-05 3 views
1
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.reflect.Method; 

// declare a new annotation 
@Retention(RetentionPolicy.RUNTIME) 
@interface Demo { 
    String str(); 
    int val(); 
} 

public class PackageDemo { 

    // set values for the annotation 
    @Demo(str = "Demo Annotation", val = 100) 
    // a method to call in the main 
    public static void example() { 
     PackageDemo ob = new PackageDemo(); 

     try { 
     Class c = ob.getClass(); 

     // get the method example 
     Method m = c.getMethod("example"); 

     // get the annotation for class Demo 
     Demo annotation = m.getAnnotation(Demo.class); 

     // print the annotation 
     System.out.println(annotation.str() + " " + annotation.val()); 
     } catch (NoSuchMethodException exc) { 
     exc.printStackTrace(); 
     } 
    } 
    public static void main(String args[]) { 
     example(); 
    } 
} 

Mein Ziel ist es, die Anmerkung auf wenige Methoden zu überprüfen und, wenn es auf die Anmerkung vorhanden ist, muss ich die Anmerkung bekommen.Laufzeit Anmerkung Scannen, wenn dynamische Laden von Klassen

Demo annotation = m.getAnnotation(Demo.class); 

Im obigen Beispiel wird die Annotation in derselben Datei deklariert. Wenn Annotation in einem anderen Paket ist, kann ich so etwas wie

import com.this.class.DemoClass 
try { 
     Class c = ob.getClass(); 

     // get the method example 
     Method m = c.getMethod("example"); 

     // get the annotation for class Demo 
     Demo annotation = m.getAnnotation(Demo.class); 

tun, aber wenn ich die DemoClass/AnnotationClass dynamisch wie

Class<?> Demo = Class.forName("com.this.class.DemoClass") 

Wie erhalte ich die Anmerkung über die Methoden laden möchten. Ich denke, die unterhalb der Linie tut funktioniert in diesem Fall nicht

Demo annotation = m.getAnnotation(Demo.class); 
+0

Können Sie genauer angeben, was Sie erreichen möchten? Versuchen Sie, ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) zu erstellen. – fragmentedreality

+1

@fragmentedreality aktualisiert die Frage lassen Sie mich wissen, wenn Sie noch Informationen benötigen. – vjr

+0

Ich schlage vor, dass Sie den Titel Ihrer Frage anpassen: Begriff "Annotationsprozessor" hat [spezifische Bedeutung] (https://StackOverflow.com/Tags/annotation-processing/info) im Rahmen der Java-Sprache. Der Begriff, der für Ihre Ziele besser geeignet wäre, ist * Runtime Annotation Scanning * oder einfach [Introspektion] (https://stackoverflow.com/tags/introspection/info). – user1643723

Antwort

1

Dieser Ansatz arbeitete mich. hoffe das hilft jemandem.

DemoClass= (Class<Annotation>) Class.forName("com.this.class.DemoClass"); 
    if (method.isAnnotationPresent(DemoClass)) { 
     for (Annotation annotation : method.getAnnotations()) { 
     Class<? extends Annotation> annotationType = annotation.annotationType();  
     if (annotationType.getName() == "com.this.class.DemoClass") { 
      for (Method annotationMethod : annotationType.getDeclaredMethods()) { 
      value= annotationMethod.invoke(annotation, (Object[]) null); 
      } 
     } 
    } 
0

Wenn die Annotation dynamisch in Variable geladen wird, Demo, dann diese Variable verwenden, um die Anmerkung zu erhalten:

Class<?> Demo = Class.forName("com.this.class.DemoClass"); 
Demo annotation = m.getAnnotation(Demo); 
+0

Versucht. Ich habe hier 2 Probleme festgestellt. Die erste ist Demo kann nicht in einen Typ aufgelöst werden und dann Die Methode getAnnotation (Klasse ) im Typ Methode ist nicht anwendbar für die Argumente. – vjr

+0

Ich stimme der fragmentierten Realität zu. Mit einem minimalen, vollständigen und überprüfbaren Beispiel können wir dann Fixes empfehlen. –

+0

Was Sie zuerst gesagt haben, ist was ich versuche zu erreichen. Aber der Ansatz funktioniert nicht wie gesagt. Die Anforderung ist klar. Nicht sicher, was du darin nicht verstehst. Ich versuche, die Annotation einer bestimmten Annotationsklasse wie Demo Annotation = m.getAnnotation (Demo); Es funktioniert, wenn ich importieren, um die Demo-Klasse zu laden. Aber nicht sicher, wie dieselbe Operation ausgeführt wird, wenn Demo.class mit Class.forname() geladen wird – vjr