2012-04-05 12 views
8

Si una clase se anota con una anotación, ¿la definición de esa anotación debe estar en el classpath en tiempo de ejecución para poder usar la clase? Por ejemplo, dada la anotación¿Se necesitan archivos de clase de anotación en la ruta de la clase de tiempo de ejecución?

import java.lang.annotation.ElementType; 
import java.lang.annotation.Target; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Retention; 
@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Component {} 

puedo ejecutar el programa

@Component 
public class Test { 
    public static void main(String[] args) { 
     System.out.println("It worked!"); 
    } 
} 

sin tener Component.class en la ruta de clase? (En mi prueba podría, ¿pero este comportamiento está definido por la especificación?)

Pregunto porque hay conflicting claims si el uso de una anotación de una biblioteca crea una dependencia en esa biblioteca.

+0

enlaces relacionados: http://mail.openjdk.java.net/pipermail/type-annotations-dev/2011-November/000079.html, https://bugs.eclipse.org/bugs /show_bug.cgi?id=366063 (para futura referencia rápida) – Jayan

+3

Dup posible: http://stackoverflow.com/questions/3567413/why-doesnt-a-missing-annotation-cause-a-classnotfoundexception-at-runtime –

+0

Gracias Matt, eso es exactamente lo que estaba buscando. – meriton

Respuesta

4

Las anotaciones en tiempo de ejecución son metainformación que el procesador de anotaciones debe procesar en el tiempo de ejecución. Si hay un acceso a la anotación en el tiempo de ejecución, definitivamente agrega anotaciones en el classpath. Por ejemplo junit definitivamente necesita las anotaciones en la ruta de clase para determinar los métodos de prueba.

Si no se procesa la anotación, no hay necesidad de tenerla en la ruta de clase.

Esperaría que incluso un AccessibleObject.getAnnotations() causaría excepciones. Es seguro para los tipos de anotación en el classpath.

+1

AccessibleObject.getAnnotations() no causa excepciones con la anotación faltante en classpath - http://bugs.java.com/view_bug.do?bug_id=6322301 – kodstark

Cuestiones relacionadas