Skip to content

How to scan classes for specific annotations and collect its values

Roberto Gentili edited this page Oct 13, 2021 · 15 revisions

Here the solution:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import org.burningwave.core.assembler.ComponentContainer;
import org.burningwave.core.assembler.ComponentSupplier;
import org.burningwave.core.classes.ClassCriteria;
import org.burningwave.core.classes.ClassHunter;
import org.burningwave.core.classes.SearchConfig;
import org.burningwave.core.io.PathHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


public class Finder {

    public List<String> find() {
        ComponentSupplier componentSupplier = ComponentContainer.getInstance();
        PathHelper pathHelper = componentSupplier.getPathHelper();
        ClassHunter classHunter = componentSupplier.getClassHunter();

        SearchConfig searchConfig = SearchConfig.forPaths(
            //Here you can add all absolute path you want:
            //both folders, zip and jar will be recursively scanned.
            //For example you can add: "C:\\Users\\user\\.m2"
            //With the line below the search will be executed on runtime class paths
            pathHelper.getMainClassPaths()
        ).by(
            ClassCriteria.create().allThoseThatMatch((cls) -> {
                return
                    //Unconment one of this if you need to filter for package name
                    //cls.getPackage().getName().matches("regular expression") &&
                    //cls.getPackage().getName().startsWith("com") &&
                    //cls.getPackage().getName().equals("com.something") &&
                    cls.getAnnotation(Controller.class) != null &&
                    cls.getAnnotation(RequestMapping.class) != null;
            })
        );
        try (ClassHunter.SearchResult searchResult = classHunter.findBy(searchConfig)) {
            
            List<String> pathsList = searchResult.getClasses().stream().map(cls -> 
                Arrays.asList(cls.getAnnotation(RequestMapping.class).value())
            ).flatMap(List::stream).distinct().collect(Collectors.toList());
    
            return pathsList;
        }
    }

}

Examples of use of some components:

BackgroundExecutor
ClassFactory
ClassHunter
ClassPathHunter
CodeExecutor
Constructors
Fields
FileSystemItem
FunctionalInterfaceFactory
IterableObjectHelper
JavaMemoryCompiler
Methods
PathHelper
PropertyAccessor
UnitSourceGenerator

HitCount

Clone this wiki locally