Сканировать путь класса для классов с пользовательской аннотацией

Например, если у меня есть аннотация @MyOwnAnnotation и у меня есть эти классы в моем пути к классам, так что я мог бы сканировать путь к классу, возможно, с каким-то фильтром (например, сканировать только пакеты, начиная с my.own.app.*), и получить список всех классов с аннотацией @MyOwnAnnotation? Я использую guice в качестве рамки для инъекций, и я не использую Spring.

Ответы

Ответ 1

Да, просмотрите библиотеку Scannotation.

Кроме того, см. следующее сообщение в блоге, в котором используется использование Scannotation.

Основной пример:

URL[] urls = ClasspathUrlFinder.findClassPaths(); // scan java.class.path
AnnotationDB db = new AnnotationDB();
db.scanArchives(urls);
Set<String> entityClasses =
    db.getAnnotationIndex().get(MyOwnAnnotation.class.getName());

Ваши аннотации должны иметь удержание "runtime", чтобы они были доступны в файле .class во время выполнения.

Ответ 2

Вы можете попробовать мою библиотеку FastClasspathScanner:

List<String> classNames = new FastClassPathScanner("my.own.app")
    .scan()
    .getNamesOfClassesWithAnnotation(MyOwnAnnotation.class);

Ответ 3

Я бы рекомендовал другой подход, лучше, чем все остальные (поскольку все они используют сканирование классов, медленное). Он называется ClassIndex, а INDEXES - аннотированные классы:

https://github.com/atteo/classindex

Ответ 4

Вы можете попробовать кукурузу-cps

Пример:

List<Class<?>> classes = CPScanner.scanClasses(new PackageNameFilter("net.sf.corn.cps.*"),new ClassFilter().appendAnnotation(SampleAnnotation.class));

установите значение dependecy ниже в pom.xml

<dependency>
    <groupId>net.sf.corn</groupId>
    <artifactId>corn-cps</artifactId>
    <version>1.0.1</version>
</dependency>