L’annotation Java renvoie les noms de classe cryptés

Comme je suis un peu nouveau sur Java, je ne comprends peut-être pas les cas d’utilisation des annotations en java. Mon problème est le suivant:

Après avoir annoté une méthode, je reçois des noms de classes tels que $ Proxy31 lors de l’inspection des annotations sur la méthode. Je suis curieux de savoir pourquoi je reçois des noms de classe pour mes annotations qui sont similaires à ce que je peux faire pour résoudre ce problème.

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

Cela retourne une annotation nulle même si je sais que l’annotation RequiredPermission est implémentée dans la méthode recherchée.

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

Ceci affiche les noms de classe $ Proxy31.

Compte tenu de l’annotation a, vous devez appeler annotationType (), pas getClass () pour déterminer le type de l’annotation. Un object Annotation est simplement un proxy qui représente cette instance de l’annotation sur cette classe.

 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()); } 

Lorsque vous ajoutez des annotations dans le code source, Java crée en réalité un ensemble d’interfaces et de classes “sous le capot” pour vous permettre (ou à vos outils) de demander au programme des informations sur les annotations à l’aide de ressortingctions. Les annotations de méthodes créent des “proxys numériques” et, en conséquence, Java crée des classes pour vous, probablement avec le nom Proxy.

Si cela vous intéresse, lisez java.lang.reflect.InvocationHandler et son sous-type, AnnotationInvocationHandler

Cela étant dit, vous ne devriez pas avoir à vous soucier de ce que Java génère réellement. Je soupçonne que vous n’utilisez pas correctement la reflection pour inspecter vos annotations depuis un programme Java.

aussi .. n’oubliez pas de définir ceci:

 @Retention(RetentionPolicy.RUNTIME) 

sur votre annotation afin qu’elle vive au-delà de la compilation.