Java Annotation gibt kryptische Klassennamen
-
20-09-2019 - |
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.
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.