projects
annotation scanner
Usage

Usage

Add dependency

Go to 🚀 maven central repository (opens in a new tab)

for Gradle

implementation group: 'io.github.mainmethod0126', name: 'annotation-scanner', version: '0.0.4'
  • short
implementation 'io.github.mainmethod0126:annotation-scanner:0.0.4'
  • kotlin
implementation("io.github.mainmethod0126:annotation-scanner:0.0.4")

for Maven

<dependency>
    <groupId>io.github.mainmethod0126</groupId>
    <artifactId>annotation-scanner</artifactId>
    <version>0.0.4</version>
</dependency>

Example

Default class loader

 
public class AnnotationScannerTest {
 
    @Test
    @DisplayName("This service locates classes that are using a specific annotation within the given package and its subpackages.")
    public void testScanClass_whenNormalParam_thenSuccess() throws ClassNotFoundException {
 
        // given
        String rootPackage = "io.github.mainmethod0126.annotation.scanner";
 
        // when
        AnnotationScanner annotationScanner = new AnnotationScanner(rootPackage);
        List<Class<?>> classes = annotationScanner.scanClass(TestAnnotation.class);
 
        for (Class<?> clazz : classes) {
            System.out.println(clazz.getName());
        }
 
        // then
        assertThat(classes).isNotNull().isNotEmpty();
    }
 
}
 

Select class loader

When using the Spring framework, it is often necessary to specify the class loader as Spring-specific class loaders are frequently utilized.

public class AnnotationScannerTest {
 
    @Test
    @DisplayName("This service locates classes that are using a specific annotation within the given package and its subpackages.")
    public void testScanClass_whenNormalParam_thenSuccess() throws ClassNotFoundException {
 
        // given
        String rootPackage = "io.github.mainmethod0126.annotation.scanner";
 
        // when
        AnnotationScanner annotationScanner = new AnnotationScanner(rootPackage);
        List<Class<?>> classes = annotationScanner.scanClass(TestAnnotation.class, this.getClass().getClassLoader());
 
        for (Class<?> clazz : classes) {
            System.out.println(clazz.getName());
        }
 
        // then
        assertThat(classes).isNotNull().isNotEmpty();
    }
 
}
 

result

# Standard output
io.github.mainmethod0126.annotation.scanner.TestOrder
io.github.mainmethod0126.annotation.scanner.TestProduct
io.github.mainmethod0126.annotation.scanner.TestUser

Why do we receive a class loader as an argument?

When considering the scenario where the 'User' class exists, if two different class loaders, A and B, each load the 'User' class separately, comparing the types of the 'User' class loaded by different class loaders would result in them being recognized as distinct classes. In such cases, when a regular user anticipates the recognition of the same class, unexpected outcomes can arise.