Escaneando anotaciones de Java en tiempo de ejecución

Resuelto Alotor asked hace 16 años • 13 respuestas

¿Cómo busco en todo el classpath una clase anotada?

Estoy creando una biblioteca y quiero permitir que los usuarios anoten sus clases, por lo que cuando se inicia la aplicación web necesito escanear todo el classpath en busca de cierta anotación.

Estoy pensando en algo así como la nueva funcionalidad para los servicios web Java EE 5 o EJB. Usted anota su clase con @WebServiceo @EJBy el sistema encuentra estas clases mientras se carga para que sean accesibles de forma remota.

Alotor avatar Nov 03 '08 23:11 Alotor
Aceptado

Utilice org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider

API

Un proveedor de componentes que escanea el classpath desde un paquete base. Luego aplica filtros de exclusión e inclusión a las clases resultantes para encontrar candidatos.

ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(<DO_YOU_WANT_TO_USE_DEFALT_FILTER>);

scanner.addIncludeFilter(new AnnotationTypeFilter(<TYPE_YOUR_ANNOTATION_HERE>.class));

for (BeanDefinition bd : scanner.findCandidateComponents(<TYPE_YOUR_BASE_PACKAGE_HERE>))
    System.out.println(bd.getBeanClassName());
Arthur Ronald avatar Sep 12 '2009 15:09 Arthur Ronald

Y otra solución son las Reflexiones de ronmamo .

Revisión rápida:

  • La solución Spring es el camino a seguir si estás usando Spring. De lo contrario, es una gran dependencia.
  • Usar ASM directamente es un poco engorroso.
  • Usar Java Assist directamente también es complicado.
  • Annovention es súper liviano y conveniente. Aún no hay integración de Maven.
  • Reflections indexa todo y luego es súper rápido.
Jonathan avatar Aug 02 '2010 21:08 Jonathan

Puede encontrar clases con cualquier anotación determinada con ClassGraph , así como buscar otros criterios de interés, por ejemplo, clases que implementen una interfaz determinada. (Descargo de responsabilidad, soy el autor de ClassGraph). ClassGraph puede crear una representación abstracta del gráfico de clase completo (todas las clases, anotaciones, métodos, parámetros de método y campos) en la memoria, para todas las clases en el classpath o para las clases en paquetes incluidos en la lista blanca, y puede consultar ese gráfico de clases como desee. ClassGraph admite más mecanismos de especificación de classpath y cargadores de clases que cualquier otro escáner, y también funciona perfectamente con el nuevo sistema de módulos JPMS, por lo que si basa su código en ClassGraph, su código será máximamente portátil. Vea la API aquí.

Luke Hutchison avatar Aug 17 '2014 22:08 Luke Hutchison

Si desea una solución realmente liviana (sin dependencias, API simple, archivo jar de 15 kb) y muy rápida , eche un vistazo a la annotation-detectorque se encuentra en https://github.com/rmuller/infomas-asl

Descargo de responsabilidad: soy el autor.

rmuller avatar Nov 21 '2011 09:11 rmuller