public class ResolverUtil<T> extends Object
ResolverUtil is used to locate classes that are available in the/a class path and meet
arbitrary conditions. The two most common conditions are that a class implements/extends
another class, or that is it annotated with a specific annotation. However, through the use
of the ResolverUtil.Test
class it is possible to search using arbitrary conditions.
A ClassLoader is used to locate all locations (directories and jar files) in the class
path that contain classes within certain packages, and then to load those classes and
check them. By default the ClassLoader returned by
Thread.currentThread().getContextClassLoader()
is used, but this can be overridden
by calling setClassLoader(ClassLoader)
prior to invoking any of the find()
methods.
General searches are initiated by calling the
find(org.apache.ibatis.io.ResolverUtil.Test, String)
()} method and supplying
a package name and a Test instance. This will cause the named package and all sub-packages
to be scanned for classes that meet the test. There are also utility methods for the common
use cases of scanning multiple packages for extensions of particular classes, or classes
annotated with a specific annotation.
The standard usage pattern for the ResolverUtil class is as follows:
ResolverUtil<ActionBean> resolver = new ResolverUtil<ActionBean>(); resolver.findImplementation(ActionBean.class, pkg1, pkg2); resolver.find(new CustomTest(), pkg1); resolver.find(new CustomTest(), pkg2); Collection<ActionBean> beans = resolver.getClasses();
Modifier and Type | Class and Description |
---|---|
static class |
ResolverUtil.AnnotatedWith
A Test that checks to see if each class is annotated with a specific annotation.
|
static class |
ResolverUtil.IsA
A Test that checks to see if each class is assignable to the provided class.
|
static interface |
ResolverUtil.Test
A simple interface that specifies how to test classes to determine if they
are to be included in the results produced by the ResolverUtil.
|
Constructor and Description |
---|
ResolverUtil() |
Modifier and Type | Method and Description |
---|---|
protected void |
addIfMatching(ResolverUtil.Test test,
String fqn)
Add the class designated by the fully qualified class name provided to the set of
resolved classes if and only if it is approved by the Test supplied.
|
ResolverUtil<T> |
find(ResolverUtil.Test test,
String packageName)
Scans for classes starting at the package provided and descending into subpackages.
|
ResolverUtil<T> |
findAnnotated(Class<? extends Annotation> annotation,
String... packageNames)
Attempts to discover classes that are annotated with the annotation.
|
ResolverUtil<T> |
findImplementations(Class<?> parent,
String... packageNames)
Attempts to discover classes that are assignable to the type provided.
|
Set<Class<? extends T>> |
getClasses()
Provides access to the classes discovered so far.
|
ClassLoader |
getClassLoader()
Returns the classloader that will be used for scanning for classes.
|
protected String |
getPackagePath(String packageName)
Converts a Java package name to a path that can be looked up with a call to
ClassLoader.getResources(String) . |
void |
setClassLoader(ClassLoader classloader)
Sets an explicit ClassLoader that should be used when scanning for classes.
|
public Set<Class<? extends T>> getClasses()
find()
methods, this set will be empty.public ClassLoader getClassLoader()
public void setClassLoader(ClassLoader classloader)
classloader
- a ClassLoader to use when scanning for classespublic ResolverUtil<T> findImplementations(Class<?> parent, String... packageNames)
getClasses()
.parent
- the class of interface to find subclasses or implementations ofpackageNames
- one or more package names to scan (including subpackages) for classespublic ResolverUtil<T> findAnnotated(Class<? extends Annotation> annotation, String... packageNames)
getClasses()
.annotation
- the annotation that should be present on matching classespackageNames
- one or more package names to scan (including subpackages) for classespublic ResolverUtil<T> find(ResolverUtil.Test test, String packageName)
getClasses()
.test
- an instance of ResolverUtil.Test
that will be used to filter classespackageName
- the name of the package from which to start scanning for
classes, e.g. net.sourceforge.stripes
protected String getPackagePath(String packageName)
ClassLoader.getResources(String)
.packageName
- The Java package name to convert to a pathprotected void addIfMatching(ResolverUtil.Test test, String fqn)
test
- the test used to determine if the class matchesfqn
- the fully qualified name of a classCopyright © 2010–2015 MyBatis.org. All rights reserved.