Frage

Ich bin etwas Neues zu Java so vielleicht ich falsch verstehen die Anwendungsfälle für Annotationen in Java. Mein Problem ist folgendes:

Nach einer Methode mit Anmerkungen versehen I Klassennamen wie $ Proxy31 erhalten, wenn die Anmerkungen auf dem Verfahren zum Prüfen. Ich bin neugierig, warum ich Klassennamen für meine Anmerkungen empfange, die zu diesem ähnlich sind, und was ich tun kann, um dieses Problem zu beheben.

Method m = this.remoteServiceClass.getMethod(rpcRequest.getMethod().getName());
RequiredPermission a = m.getAnnotation(RequiredPermission.class);

Dies gibt eine Null-Anmerkung, obwohl ich weiß, dass das Verfahren es schaut oben hat die RequiredPermission Anmerkung implementiert.

for(Annotation a : m.getAnnotations())
{
    System.out.println(a.getClass().getName());
}

Diese druckt die $ Proxy31 Klassennamen.

War es hilfreich?

Lösung

Bei Annotation ein, müssen Sie annotationType () aufrufen, nicht getClass (), um die Art der Anmerkung zu bestimmen. Eine Annotation Objekt ist nur ein Proxy, der die Instanz der Anmerkung zu dieser Klasse darstellt.

Object o = ...;
Class c = o.getClass();
Annotation[] as = c.getAnnotations();
for (Annotation a : as) {
   // prints out the proxy class name
   System.out.println(a.getClass().getName());
   // prints out the name of the actual annotation
   System.out.println(a.annotationType().getName());
}

Andere Tipps

Wenn Sie Anmerkungen im Quelltext hinzufügen, Java tatsächlich eine Reihe von Schnittstellen und Klassen schafft „unter der Haube“, damit Sie (oder Ihre Werkzeuge), um das Programm Dinge über die Anmerkungen stellen Einschränkungen verwenden. Methode Anmerkungen erstellen „dyanmic Proxies“, und dementsprechend Java erstellt Klassen für Sie, wahrscheinlich mit dem Namen Proxy.

Wenn Sie daran interessiert sind, lesen Sie weiter java.lang.reflect.InvocationHandler und seine Subtyp, AnnotationInvocationHandler

That being said, sollten Sie sich keine Sorgen machen müssen, was Java tatsächlich erzeugt. Ich vermute, Sie verwenden Reflexion nicht korrekt Ihre Anmerkungen aus einem Java-Programm zu überprüfen.

auch .. denken Sie daran zu setzen:

@Retention(RetentionPolicy.RUNTIME)

auf der Anmerkung, so dass er lebt jenseits der Kompilierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top