Package org.apache.xbean.finder
Class AnnotationFinder
- java.lang.Object
-
- org.apache.xbean.finder.AnnotationFinder
-
- All Implemented Interfaces:
IAnnotationFinder
public class AnnotationFinder extends java.lang.Object implements IAnnotationFinder
ClassFinder searches the classpath of the specified classloader for packages, classes, constructors, methods, or fields with specific annotations. For security reasons ASM is used to find the annotations. Classes are not loaded unless they match the requirements of a called findAnnotated* method. Once loaded, these classes are cached.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description class
AnnotationFinder.Annotatable
class
AnnotationFinder.AnnotationInfo
class
AnnotationFinder.ClassInfo
class
AnnotationFinder.FieldInfo
static interface
AnnotationFinder.Info
class
AnnotationFinder.InfoBuildingVisitor
class
AnnotationFinder.MethodInfo
class
AnnotationFinder.PackageInfo
class
AnnotationFinder.ParameterInfo
class
AnnotationFinder.SubArchive
-
Field Summary
Fields Modifier and Type Field Description protected java.util.Map<java.lang.String,java.util.List<AnnotationFinder.Info>>
annotated
protected java.util.Map<java.lang.String,AnnotationFinder.ClassInfo>
classInfos
protected java.util.Map<java.lang.String,AnnotationFinder.ClassInfo>
originalInfos
-
Constructor Summary
Constructors Constructor Description AnnotationFinder(Archive archive)
AnnotationFinder(Archive archive, boolean checkRuntimeAnnotation)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected boolean
cleanOnNaked()
AnnotationFinder
enableFindImplementations()
AnnotationFinder
enableFindSubclasses()
AnnotationFinder
enableMetaAnnotations()
java.util.List<java.lang.Class<?>>
findAnnotatedClasses(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<Parameter<java.lang.reflect.Constructor<?>>>
findAnnotatedConstructorParameters(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<java.lang.reflect.Constructor>
findAnnotatedConstructors(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<java.lang.reflect.Field>
findAnnotatedFields(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<Parameter<java.lang.reflect.Method>>
findAnnotatedMethodParameters(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<java.lang.reflect.Method>
findAnnotatedMethods(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<java.lang.Package>
findAnnotatedPackages(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<java.lang.Class<?>>
findClassesInPackage(java.lang.String packageName, boolean recursive)
<T> java.util.List<java.lang.Class<? extends T>>
findImplementations(java.lang.Class<T> clazz)
java.util.List<java.lang.Class<?>>
findInheritedAnnotatedClasses(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
Naive implementation - works extremelly slow O(n^3)java.util.List<Annotated<java.lang.Class<?>>>
findMetaAnnotatedClasses(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<Annotated<java.lang.reflect.Field>>
findMetaAnnotatedFields(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
java.util.List<Annotated<java.lang.reflect.Method>>
findMetaAnnotatedMethods(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
<T> java.util.List<java.lang.Class<? extends T>>
findSubclasses(java.lang.Class<T> clazz)
java.util.List<java.lang.String>
getAnnotatedClassNames()
protected java.util.List<AnnotationFinder.Info>
getAnnotationInfos(java.lang.String name)
Archive
getArchive()
java.util.List<java.lang.String>
getClassesNotLoaded()
Returns a list of classes that could not be loaded in last invoked findAnnotated* method.boolean
hasMetaAnnotations()
protected java.util.List<AnnotationFinder.Info>
initAnnotationInfos(java.lang.String name)
boolean
isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
protected boolean
isJvm(java.lang.String name)
protected boolean
isTracked(java.lang.String annotationType)
AnnotationFinder
link()
The link() method must be called to successfully use the findSubclasses and findImplementations methodsprotected void
linkInterfaces(AnnotationFinder.ClassInfo classInfo)
protected void
linkParent(AnnotationFinder.ClassInfo classInfo)
protected java.util.Map<java.lang.String,java.util.List<AnnotationFinder.Info>>
newAnnotatedMap()
protected java.util.Map<java.lang.String,AnnotationFinder.ClassInfo>
newClassInfoMap()
protected void
readClassDef(java.lang.Class clazz)
protected void
readClassDef(java.lang.String className)
protected void
readClassDef(java.lang.String className, java.io.InputStream in)
AnnotationFinder
select(java.lang.Class<?>... clazz)
AnnotationFinder
select(java.lang.Iterable<java.lang.String> clazz)
AnnotationFinder
select(java.lang.String... clazz)
-
-
-
Field Detail
-
annotated
protected final java.util.Map<java.lang.String,java.util.List<AnnotationFinder.Info>> annotated
-
classInfos
protected final java.util.Map<java.lang.String,AnnotationFinder.ClassInfo> classInfos
-
originalInfos
protected final java.util.Map<java.lang.String,AnnotationFinder.ClassInfo> originalInfos
-
-
Method Detail
-
newAnnotatedMap
protected java.util.Map<java.lang.String,java.util.List<AnnotationFinder.Info>> newAnnotatedMap()
-
newClassInfoMap
protected java.util.Map<java.lang.String,AnnotationFinder.ClassInfo> newClassInfoMap()
-
cleanOnNaked
protected boolean cleanOnNaked()
-
isTracked
protected boolean isTracked(java.lang.String annotationType)
-
hasMetaAnnotations
public boolean hasMetaAnnotations()
-
getAnnotatedClassNames
public java.util.List<java.lang.String> getAnnotatedClassNames()
- Specified by:
getAnnotatedClassNames
in interfaceIAnnotationFinder
-
getArchive
public Archive getArchive()
-
link
public AnnotationFinder link()
The link() method must be called to successfully use the findSubclasses and findImplementations methods- Returns:
- Throws:
java.io.IOException
-
enableMetaAnnotations
public AnnotationFinder enableMetaAnnotations()
-
enableFindImplementations
public AnnotationFinder enableFindImplementations()
-
enableFindSubclasses
public AnnotationFinder enableFindSubclasses()
-
linkParent
protected void linkParent(AnnotationFinder.ClassInfo classInfo)
-
isJvm
protected boolean isJvm(java.lang.String name)
-
linkInterfaces
protected void linkInterfaces(AnnotationFinder.ClassInfo classInfo)
-
isAnnotationPresent
public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
isAnnotationPresent
in interfaceIAnnotationFinder
-
getClassesNotLoaded
public java.util.List<java.lang.String> getClassesNotLoaded()
Returns a list of classes that could not be loaded in last invoked findAnnotated* method. The list will only contain entries of classes whose byte code matched the requirements of last invoked find* method, but were unable to be loaded and included in the results. The list returned is unmodifiable. Once obtained, the returned list will be a live view of the results from the last findAnnotated* method call. This method is not thread safe.- Specified by:
getClassesNotLoaded
in interfaceIAnnotationFinder
- Returns:
- an unmodifiable live view of classes that could not be loaded in previous findAnnotated* call.
-
findAnnotatedPackages
public java.util.List<java.lang.Package> findAnnotatedPackages(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findAnnotatedPackages
in interfaceIAnnotationFinder
-
findAnnotatedClasses
public java.util.List<java.lang.Class<?>> findAnnotatedClasses(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findAnnotatedClasses
in interfaceIAnnotationFinder
-
findMetaAnnotatedClasses
public java.util.List<Annotated<java.lang.Class<?>>> findMetaAnnotatedClasses(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findMetaAnnotatedClasses
in interfaceIAnnotationFinder
-
findInheritedAnnotatedClasses
public java.util.List<java.lang.Class<?>> findInheritedAnnotatedClasses(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
Naive implementation - works extremelly slow O(n^3)- Specified by:
findInheritedAnnotatedClasses
in interfaceIAnnotationFinder
- Parameters:
annotation
-- Returns:
- list of directly or indirectly (inherited) annotated classes
-
findAnnotatedMethods
public java.util.List<java.lang.reflect.Method> findAnnotatedMethods(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findAnnotatedMethods
in interfaceIAnnotationFinder
-
findAnnotatedMethodParameters
public java.util.List<Parameter<java.lang.reflect.Method>> findAnnotatedMethodParameters(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
-
findMetaAnnotatedMethods
public java.util.List<Annotated<java.lang.reflect.Method>> findMetaAnnotatedMethods(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findMetaAnnotatedMethods
in interfaceIAnnotationFinder
-
findMetaAnnotatedFields
public java.util.List<Annotated<java.lang.reflect.Field>> findMetaAnnotatedFields(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findMetaAnnotatedFields
in interfaceIAnnotationFinder
-
findAnnotatedConstructors
public java.util.List<java.lang.reflect.Constructor> findAnnotatedConstructors(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findAnnotatedConstructors
in interfaceIAnnotationFinder
-
findAnnotatedConstructorParameters
public java.util.List<Parameter<java.lang.reflect.Constructor<?>>> findAnnotatedConstructorParameters(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
-
findAnnotatedFields
public java.util.List<java.lang.reflect.Field> findAnnotatedFields(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
- Specified by:
findAnnotatedFields
in interfaceIAnnotationFinder
-
findClassesInPackage
public java.util.List<java.lang.Class<?>> findClassesInPackage(java.lang.String packageName, boolean recursive)
- Specified by:
findClassesInPackage
in interfaceIAnnotationFinder
-
findSubclasses
public <T> java.util.List<java.lang.Class<? extends T>> findSubclasses(java.lang.Class<T> clazz)
- Specified by:
findSubclasses
in interfaceIAnnotationFinder
-
findImplementations
public <T> java.util.List<java.lang.Class<? extends T>> findImplementations(java.lang.Class<T> clazz)
- Specified by:
findImplementations
in interfaceIAnnotationFinder
-
getAnnotationInfos
protected java.util.List<AnnotationFinder.Info> getAnnotationInfos(java.lang.String name)
-
initAnnotationInfos
protected java.util.List<AnnotationFinder.Info> initAnnotationInfos(java.lang.String name)
-
readClassDef
protected void readClassDef(java.lang.String className)
-
readClassDef
protected void readClassDef(java.lang.String className, java.io.InputStream in) throws java.io.IOException
- Throws:
java.io.IOException
-
readClassDef
protected void readClassDef(java.lang.Class clazz)
-
select
public AnnotationFinder select(java.lang.Class<?>... clazz)
-
select
public AnnotationFinder select(java.lang.String... clazz)
-
select
public AnnotationFinder select(java.lang.Iterable<java.lang.String> clazz)
-
-