2009-09-01 10 views
15

soy algo nuevo en Java, por lo que tal vez entienden mal los casos de uso para las anotaciones en Java. Mi problema es el siguiente:Java anotación devuelve los nombres de clase crípticos

Después de anotar un método recibo nombres de clases como $ Proxy31 al inspeccionar las anotaciones en el método. Tengo curiosidad por saber por qué estoy recibiendo nombres de clase para mis anotaciones que son similares a esto, y qué puedo hacer para solucionar este problema.

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

Esto devuelve una anotación nula a pesar de que sé que el método que está mirando hacia arriba tiene la anotación RequiredPermission implementado.

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

Esto imprime los nombres de clase $ Proxy31.

+0

Sírvanse proporcionar un programa corto pero completo para demostrar el problema. Sin el código es difícil/imposible saber qué está pasando. –

+0

La clase remota tiene el método, o la clase rpcRequest tiene la anotación implementada? ¿La anotación tiene retención de tiempo de ejecución y se aplica a un tipo de método? (No obtendrá errores si la anotación no está anotada correctamente, la anotación simplemente se pierde). – Yishai

+0

RemoteServiceClass tiene el método, la anotación tiene retención de tiempo de ejecución y un tipo de método de elemento de destino. Estoy usando el nombre de rpcRequest para recuperar el método real de la clase. – bdorry

Respuesta

21

Dada la Anotación a, necesita llamar a annotationType(), no getClass() para determinar el tipo de la anotación. Un objeto de Anotación es solo un proxy que representa esa instancia de la anotación en esa clase.

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

(Debido a que una anotación es una interfaz y, por lo tanto, una instancia no puede ser una clase concreta de ejecución) –

+0

Eso es incorrecto. Una interfaz todavía tiene un objeto Class asociado. – Jherico

+1

@Jherico, eso es cierto, pero una instancia de tiempo de ejecución real no tendrá una interfaz como resultado de su método getClass(). – Yishai

1

Cuando se agrega anotaciones en el código fuente de Java en realidad crea un grupo de interfaces y clases "bajo el capó" para permitir que usted (o sus herramientas) para hacer las cosas de programas sobre las anotaciones usando restricciones. Las anotaciones de método crean "proyys dyanmic" y, en consecuencia, Java crea clases para usted, probablemente con el nombre Proxy.

Si usted está interesado en esto, sigue leyendo java.lang.reflect.InvocationHandler y su subtipo, AnnotationInvocationHandler

Dicho esto, no debería tener que preocuparse acerca de lo que realmente genera Java. Sospecho que no está utilizando la reflexión correctamente para inspeccionar sus anotaciones desde dentro de un programa Java.

1

también .. recuerde poner esto:

@Retention(RetentionPolicy.RUNTIME) 

en su anotación de modo que vive más allá de la compilación.

Cuestiones relacionadas