2012-03-23 4 views
5

Tengo un archivo de clase test.class. En ese archivo hay anotaciones como @Id y @Entity. Pero cuando compruebo la anotación con el método field.isAnnotationPresent(Id.class), devuelve false. Estoy obteniendo todos los campos en la variable de campo.Por qué isAnnotationPresent (Id.class) no funciona para el archivo de clase

¿Puede alguien decirme qué error cometí?

actualización: estoy usando el siguiente código para obtener la clase

File file=new File("D:/test/"); 
URL url=file.toURL(); 
URL[] urls=new URL[]{url}; 
ClassLoader loader=new URLClassLoader(urls); 
Class cls=loader.loadClass("com.net.test.Test"); 
+0

¿Puede mostrarnos el código que no está funcionando para usted? –

Respuesta

1

Tu de prueba puede tener un diferente Id que loader 's.

Una forma rápida de comprobar:

... 
Class idType = loader.loadClass("my.package.Id"); 
... 
field.isAnnotationPresent(idType); 

Si eso funciona, entonces usted tiene un problema cargador de clases - más específicamente, su cargador de loader no utiliza su caso de prueba. Para solucionar, utilice un constructor diferente:

ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader()); 
+0

tienes razón, cambié el constructor ClassLoader. Ahora funciona perfectamente, muchas gracias. – elvisanandkumar

1

Funciona en general. Aquí hay un ejemplo de trabajo:

import java.lang.reflect.Field; 

public class AnnotationTest { 

    @Deprecated 
    public static int value = 1; 

    public static void main(String[] args) throws Exception { 
     Field field = AnnotationTest.class.getField("value"); 
     System.out.println(field.isAnnotationPresent(Deprecated.class)); 
    } 
} 

Vuelva a verificar sus nombres de clase y las importaciones. Tal vez verifique accidentalmente un Id.class incorrecto (nameclash).

25

¿Ha anotado su anotación con una política de retención? Si no se establece una política de retención, el comportamiento de la política de retención predeterminada es que la anotación es leída por el compilador y también retenida en los archivos .class generados, pero no será accesible durante el tiempo de ejecución. Si necesita la anotación en tiempo de ejecución necesita anotar sus anotaciones con: cargador de clases

@Retention(RetentionPolicy.RUNTIME) 
+0

'@ Id' y' @ Entity' * do * have 'RetentionPolicy.RUNTIME' – skaffman

+0

¿Se trata de anotaciones JPA? –

+1

Gracias, me faltaba la política de retención en mi código y estaba corriendo hacia un problema similar. – Keshav

0

Si utiliza isAnnotationPresent() en la primavera AOP interceptor y proxyTargetClass = false, añadir una anotación en la interfaz de destino en lugar de la clase de implementación.

Cuestiones relacionadas