In order to find all classes that implement one or more interfaces by using the ClassHunter, we must add the following dependency to our pom.xml:
<dependency> <groupId>org.burningwave</groupId> <artifactId>core</artifactId> <version>12.64.3</version> </dependency>
… And to use Burningwave Core as a Java module, add the following to your module-info.java
:
requires org.burningwave.core;
Then let’s look for all classes that implement java.io.Closeable or java.io.Serializable interface:
import java.io.Closeable; import java.io.Serializable; import java.util.Collection; 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; public class Finder { public Collection<Class<?>> simplifiedFind() { ComponentSupplier componentSupplier = ComponentContainer.getInstance(); ClassHunter classHunter = componentSupplier.getClassHunter(); //With this the search will be executed on default configured paths that are the //runtime class paths plus, on java 9 and later, the jmods folder of the Java home. //The default configured paths are indicated in the 'paths.hunters.default-search-config.paths' //property of burningwave.properties file (see Architectural overview and configuration) try (ClassHunter.SearchResult searchResult = classHunter.findBy( SearchConfig.byCriteria( ClassCriteria.create().allThoseThatMatch(currentScannedClass -> Closeable.class.isAssignableFrom(currentScannedClass) || Serializable.class.isAssignableFrom(currentScannedClass) ) ) )) { return searchResult.getClasses(); } } }
It is also possible to expressly indicate the paths on which to search:
import java.io.Closeable; import java.io.Serializable; import java.util.Collection; 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; public class Finder { public Collection<Class<?>> find() { ComponentSupplier componentSupplier = ComponentContainer.getInstance(); PathHelper pathHelper = componentSupplier.getPathHelper(); ClassHunter classHunter = componentSupplier.getClassHunter(); SearchConfig searchConfig = SearchConfig.forPaths( pathHelper.getPaths(path -> path.contains("spring-core-4.3.4.RELEASE.jar")) ).by( ClassCriteria.create().byClassesThatMatch((uploadedClasses, currentScannedClass) -> //[1]here you recall the uploaded class by "useClasses" method. //In this case we're looking for all classes that implement java.io.Closeable or java.io.Serializable uploadedClasses.get(Closeable.class).isAssignableFrom(currentScannedClass) || uploadedClasses.get(Serializable.class).isAssignableFrom(currentScannedClass) ).useClasses( //With this directive we ask the library to load one or more classes to be used for comparisons: //it serves to eliminate the problem that a class, loaded by different class loaders, //turns out to be different for the comparison operators (eg. The isAssignableFrom method). //If you call this method, you must retrieve the uploaded class in all methods that support this feature like in the point[1] Closeable.class, Serializable.class ) ); try (ClassHunter.SearchResult searchResult = classHunter.findBy(searchConfig)) { return searchResult.getClasses(); } } }
BackgroundExecutor
ClassFactory
ClassHunter
- In depth look to and configuration guide
- USE CASE: how to retrieve all classes of the classpath
- USE CASE: how to retrieve all classes that implement one or more interfaces
- USE CASE: finding all classes that extend a base class
- USE CASE: how to find all classes in a package
- USE CASE: Finding all classes for module name (Java 9 and later)
- USE CASE: finding all annotated classes
- USE CASE: how to scan classes for specific annotations and collect their values
- USE CASE: how to search for all classes with a constructor that takes a specific type as first parameter and with at least 2 methods that begin for a given string
- USE CASE: how to search for all classes with methods whose name begins for a given string and that takes a specific type as its first parameter
- USE CASE: finding all classes that have at least 2 protected fields
ClassPathHunter
CodeExecutor
FileSystemItem
FunctionalInterfaceFactory
IterableObjectHelper
JavaMemoryCompiler
PropertyAccessor
UnitSourceGenerator