Question

Je suis un peu nouveau pour Java alors peut-être que je comprends mal les cas d'utilisation des annotations en java. Ma question est la suivante:

Après annoter une méthode que je reçois les noms de classe tels que $ Proxy31 lors de l'inspection des annotations sur la méthode. Je suis curieux de savoir pourquoi je reçois les noms de classe pour mes annotations qui sont semblables à cela, et 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);

renvoie une annotation nulle, même si je sais que la méthode, il est à la recherche a l'annotation RequiredPermission mis en œuvre.

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

Ceci affiche les noms de classe $ Proxy31.

Était-ce utile?

La solution

Étant donné une Annotation, vous devez appeler AnnotationType (), non getClass () pour déterminer le type de l'annotation. Un objet d'annotation est juste 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());
}

Autres conseils

Lorsque vous ajoutez des annotations dans le code source, Java crée en fait un tas d'interfaces et de classes « sous le capot » pour vous permettre (ou vos outils) pour demander les choses du programme sur les annotations à l'aide de restrictions. annotations méthode créer des "proxies" dyanmic, et en conséquence Java crée des classes pour vous, probablement avec le proxy nom.

Si vous êtes intéressé, lisez ce qui suit 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 en fait. Je suppose que vous n'utilisez pas correctement la réflexion pour inspecter vos annotations à partir d'un programme Java.

aussi .. rappelez-vous de définir ceci:

@Retention(RetentionPolicy.RUNTIME)

sur l'annotation afin qu'elle vit au-delà de la compilation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top