Necesito leer las clases contenidas en un paquete de Java. Esas clases están en classpath. Necesito hacer esta tarea directamente desde un programa Java. ¿Conoces una forma sencilla de hacerlo?
List<Class> classes = readClassesFrom("my.package")
java
reflection
Jørgen R
fuente
fuente
Respuestas:
Si tiene Spring en su classpath, lo siguiente lo hará.
Busque todas las clases en un paquete que están anotadas con XmlRootElement:
fuente
Puede utilizar el Proyecto Reflections descrito aquí
Es bastante completo y fácil de usar.
Breve descripción del sitio web anterior:
Ejemplo:
fuente
Yo uso este, funciona con archivos o archivos jar
fuente
Spring ha implementado una excelente función de búsqueda de rutas de clases en
PathMatchingResourcePatternResolver
. Si usa elclasspath*
prefijo:, puede encontrar todos los recursos, incluidas las clases en una jerarquía determinada, e incluso filtrarlos si lo desea. Entonces puedes usar los hijos deAbstractTypeHierarchyTraversingFilter
,AnnotationTypeFilter
yAssignableTypeFilter
para filtrar esos recursos, ya sea en el nivel de anotaciones de clase o en las interfaces que implementan.fuente
Java 1.6.0_24:
Esta solución se probó en el entorno EJB .
fuente
Scannotation y Reflections utilizan un enfoque de escaneo de rutas de clases:
Otro enfoque es utilizar la API de procesamiento de anotaciones Java Pluggable para escribir un procesador de anotaciones que recopilará todas las clases anotadas en tiempo de compilación y creará el archivo de índice para su uso en tiempo de ejecución. Este mecanismo se implementa en la biblioteca ClassIndex :
fuente
Hasta donde yo sé, esa funcionalidad todavía falta sospechosamente en la API de reflexión de Java. Puede obtener un objeto de paquete simplemente haciendo esto:
Pero como probablemente haya notado, eso no le permitirá enumerar las clases en ese paquete. A partir de ahora, debe adoptar un enfoque más orientado al sistema de archivos.
Encontré algunas implementaciones de muestra en esta publicación.
No estoy 100% seguro de que estos métodos funcionen cuando tus clases estén enterradas en archivos JAR, pero espero que uno de ellos lo haga por ti.
Estoy de acuerdo con @skaffman ... si tienes otra forma de hacer esto, te recomendaría hacerlo.
fuente
El mecanismo más robusto para listar todas las clases en un paquete dado es actualmente ClassGraph , porque maneja la más amplia gama posible de mecanismos de especificación de rutas de clases , incluido el nuevo sistema de módulos JPMS. (Yo soy el autor)
fuente
eXtcos parece prometedor. Imagina que quieres encontrar todas las clases que:
Con eXtcos esto es tan simple como
fuente
Bill Burke ha escrito un (buen artículo sobre el escaneo de clases) y luego escribió Scannotation .
Hibernate ya tiene esto escrito:
CDI podría resolver esto, pero no lo sé, aún no lo he investigado completamente
.
También para anotaciones:
fuente
Lo he implementado y funciona en la mayoría de los casos. Como es largo, lo puse en un archivo aquí. .
La idea es encontrar la ubicación del archivo fuente de la clase que está disponible en la mayoría de los casos (una excepción conocida son los archivos de clase JVM, hasta donde he probado). Si el código está en un directorio, escanee todos los archivos y solo detecte los archivos de clase. Si el código está en un archivo JAR, escanee todas las entradas.
Este método solo se puede utilizar cuando:
Tiene una clase que está en el mismo paquete que desea descubrir. Esta clase se llama SeedClass. Por ejemplo, si desea enumerar todas las clases en 'java.io', la clase semilla puede ser
java.io.File
.Sus clases están en un directorio o en un archivo JAR que tiene información de archivo fuente (no archivo de código fuente, sino solo archivo fuente). Por lo que he intentado, funciona casi al 100% excepto la clase JVM (esas clases vienen con la JVM).
Su programa debe tener permiso para acceder a ProtectionDomain de esas clases. Si su programa se carga localmente, no debería haber ningún problema.
He probado el programa solo para mi uso habitual, por lo que aún puede tener problemas.
Espero que esto ayude.
fuente
Aquí hay otra opción, una ligera modificación a otra respuesta arriba / abajo:
fuente
Cuando los applets eran un lugar común, se podía tener una URL en la ruta de clases. Cuando el cargador de clases requería una clase, buscaba todas las ubicaciones en la ruta de clases, incluidos los recursos http. Debido a que puede tener cosas como URL y directorios en la ruta de clases, no hay una manera fácil de obtener una lista definitiva de las clases.
Sin embargo, puedes acercarte bastante. Algunas de las bibliotecas de Spring están haciendo esto ahora. Puede obtener todos los archivos jar en la ruta de clases y abrirlos como archivos. Luego puede tomar esta lista de archivos y crear una estructura de datos que contenga sus clases.
fuente
utilizar maven de dependencia:
luego usa este código:
fuente
Brent: la razón por la que la asociación es unidireccional tiene que ver con el hecho de que cualquier clase en cualquier componente de su CLASSPATH puede declararse en cualquier paquete (excepto java / javax). Por lo tanto, simplemente no hay mapeo de TODAS las clases en un "paquete" dado porque nadie sabe ni puede saber. Puede actualizar un archivo jar mañana y eliminar o agregar clases. Es como intentar obtener una lista de todas las personas llamadas John / Jon / Johan en todos los países del mundo: ninguno de nosotros es omnisciente, por lo tanto, ninguno de nosotros tendrá la respuesta correcta.
fuente