Class ClassInfo

    • Field Detail

      • name

        protected java.lang.String name
        The name of the class.
      • modifiers

        private int modifiers
        Class modifier flags, e.g. Modifier.PUBLIC
      • isRecord

        private boolean isRecord
        True if the class is a record.
      • isInherited

        boolean isInherited
        This annotation has the Inherited meta-annotation, which means that any class that this annotation is applied to also implicitly causes the annotation to annotate all subclasses too.
      • classfileMinorVersion

        private int classfileMinorVersion
        The minor version of the classfile format for this class' classfile.
      • classfileMajorVersion

        private int classfileMajorVersion
        The major version of the classfile format for this class' classfile.
      • typeSignatureStr

        protected java.lang.String typeSignatureStr
        The class type signature string.
      • typeSignature

        private transient ClassTypeSignature typeSignature
        The class type signature, parsed.
      • typeDescriptor

        private transient ClassTypeSignature typeDescriptor
        The synthetic class type descriptor.
      • sourceFile

        private java.lang.String sourceFile
        The name of the source file this class has been compiled from
      • fullyQualifiedDefiningMethodName

        private java.lang.String fullyQualifiedDefiningMethodName
        The fully-qualified defining method name, for anonymous inner classes.
      • isExternalClass

        protected boolean isExternalClass
        If true, this class is only being referenced by another class' classfile as a superclass / implemented interface / annotation, but this class is not itself an accepted (non-rejected) class, or in a accepted (non-rejected) package. If false, this classfile was matched during scanning (i.e. its classfile contents read), i.e. this class is a accepted (and non-rejected) class in an accepted (and non-rejected) package.
      • isScannedClass

        protected boolean isScannedClass
        Set to true when the class is actually scanned (as opposed to just referenced as a superclass, interface or annotation of a scanned class).
      • classpathElement

        transient ClasspathElement classpathElement
        The classpath element that this class was found within.
      • classfileResource

        protected transient Resource classfileResource
        The Resource for the classfile of this class.
      • classLoader

        transient java.lang.ClassLoader classLoader
        The classloader this class was obtained from.
      • moduleInfo

        ModuleInfo moduleInfo
        Info on the class module.
      • packageInfo

        PackageInfo packageInfo
        Info on the package containing the class.
      • annotationInfo

        AnnotationInfoList annotationInfo
        Info on class annotations, including optional annotation param values.
      • referencedClassNames

        private java.util.Set<java.lang.String> referencedClassNames
        Names of classes referenced by this class in class refs and type signatures in the constant pool of the classfile.
      • annotationDefaultParamValuesHasBeenConvertedToPrimitive

        transient boolean annotationDefaultParamValuesHasBeenConvertedToPrimitive
        Set to true once any Object[] arrays of boxed types in annotationDefaultParamValues have been lazily converted to primitive arrays.
      • relatedClasses

        private java.util.Map<ClassInfo.RelType,​java.util.Set<ClassInfo>> relatedClasses
        The set of classes related to this one.
      • overrideOrder

        private transient java.util.List<ClassInfo> overrideOrder
        The override order for a class' fields or methods (base class, followed by interfaces, followed by superclasses).
      • methodOverrideOrder

        private transient java.util.List<ClassInfo> methodOverrideOrder
        The override order for a class' methods (base class, followed by superclasses, followed by interfaces).
      • ANNOTATION_CLASS_MODIFIER

        private static final int ANNOTATION_CLASS_MODIFIER
        The modifier bit for annotations.
        See Also:
        Constant Field Values
    • Constructor Detail

      • ClassInfo

        ClassInfo()
        Default constructor for deserialization.
      • ClassInfo

        protected ClassInfo​(java.lang.String name,
                            int classModifiers,
                            Resource classfileResource)
        Constructor.
        Parameters:
        name - the name
        classModifiers - the class modifiers
        classfileResource - the classfile resource
    • Method Detail

      • addRelatedClass

        boolean addRelatedClass​(ClassInfo.RelType relType,
                                ClassInfo classInfo)
        Add a class with a given relationship type. Return whether the collection changed as a result of the call.
        Parameters:
        relType - the ClassInfo.RelType
        classInfo - the ClassInfo
        Returns:
        true, if successful
      • getOrCreateClassInfo

        static ClassInfo getOrCreateClassInfo​(java.lang.String className,
                                              java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Get a ClassInfo object, or create it if it doesn't exist. N.B. not threadsafe, so ClassInfo objects should only ever be constructed by a single thread.
        Parameters:
        className - the class name
        classNameToClassInfo - the map from class name to class info
        Returns:
        the ClassInfo object.
      • setClassfileVersion

        void setClassfileVersion​(int minorVersion,
                                 int majorVersion)
        Set classfile version.
        Parameters:
        minorVersion - the minor version of the classfile format for this class' classfile.
        majorVersion - the major version of the classfile format for this class' classfile.
      • setModifiers

        void setModifiers​(int modifiers)
        Set class modifiers.
        Parameters:
        modifiers - the class modifiers
      • setIsInterface

        void setIsInterface​(boolean isInterface)
        Set isInterface status.
        Parameters:
        isInterface - true if this is an interface
      • setIsAnnotation

        void setIsAnnotation​(boolean isAnnotation)
        Set isAnnotation status.
        Parameters:
        isAnnotation - true if this is an annotation
      • setIsRecord

        void setIsRecord​(boolean isRecord)
        Set isRecord status.
        Parameters:
        isRecord - true if this is a record
      • setSourceFile

        void setSourceFile​(java.lang.String sourceFile)
        Set source file.
        Parameters:
        sourceFile - the source file
      • addSuperclass

        void addSuperclass​(java.lang.String superclassName,
                           java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Add a superclass to this class.
        Parameters:
        superclassName - the superclass name
        classNameToClassInfo - the map from class name to class info
      • addImplementedInterface

        void addImplementedInterface​(java.lang.String interfaceName,
                                     java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Add an implemented interface to this class.
        Parameters:
        interfaceName - the interface name
        classNameToClassInfo - the map from class name to class info
      • addClassContainment

        static void addClassContainment​(java.util.List<Classfile.ClassContainment> classContainmentEntries,
                                        java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Add class containment info.
        Parameters:
        classContainmentEntries - the class containment entries
        classNameToClassInfo - the map from class name to class info
      • addFullyQualifiedDefiningMethodName

        void addFullyQualifiedDefiningMethodName​(java.lang.String fullyQualifiedDefiningMethodName)
        Add containing method name, for anonymous inner classes.
        Parameters:
        fullyQualifiedDefiningMethodName - the fully qualified defining method name
      • addClassAnnotation

        void addClassAnnotation​(AnnotationInfo classAnnotationInfo,
                                java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Add an annotation to this class.
        Parameters:
        classAnnotationInfo - the class annotation info
        classNameToClassInfo - the map from class name to class info
      • addFieldOrMethodAnnotationInfo

        private void addFieldOrMethodAnnotationInfo​(AnnotationInfoList annotationInfoList,
                                                    boolean isField,
                                                    int modifiers,
                                                    java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Add field or method annotation cross-links.
        Parameters:
        annotationInfoList - the annotation info list
        isField - the is field
        modifiers - the field or method modifiers
        classNameToClassInfo - the map from class name to class info
      • addFieldInfo

        void addFieldInfo​(FieldInfoList fieldInfoList,
                          java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Add field info.
        Parameters:
        fieldInfoList - the field info list
        classNameToClassInfo - the map from class name to class info
      • addMethodInfo

        void addMethodInfo​(MethodInfoList methodInfoList,
                           java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo)
        Add method info.
        Parameters:
        methodInfoList - the method info list
        classNameToClassInfo - the map from class name to class info
      • setTypeSignature

        void setTypeSignature​(java.lang.String typeSignatureStr)
        Set the class type signature, including any type params.
        Parameters:
        typeSignatureStr - the type signature str
      • addAnnotationParamDefaultValues

        void addAnnotationParamDefaultValues​(AnnotationParameterValueList paramNamesAndValues)
        Add annotation default values. (Only called in the case of annotation class definitions, when the annotation has default parameter values.)
        Parameters:
        paramNamesAndValues - the default param names and values, if this is an annotation
      • addScannedClass

        static ClassInfo addScannedClass​(java.lang.String className,
                                         int classModifiers,
                                         boolean isExternalClass,
                                         java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo,
                                         ClasspathElement classpathElement,
                                         Resource classfileResource)
        Add a class that has just been scanned (as opposed to just referenced by a scanned class). Not threadsafe, should be run in single threaded context.
        Parameters:
        className - the class name
        classModifiers - the class modifiers
        isExternalClass - true if this is an external class
        classNameToClassInfo - the map from class name to class info
        classpathElement - the classpath element
        classfileResource - the classfile resource
        Returns:
        the class info
      • filterClassInfo

        private static java.util.Set<ClassInfo> filterClassInfo​(java.util.Collection<ClassInfo> classes,
                                                                ScanSpec scanSpec,
                                                                boolean strictAccept,
                                                                ClassInfo.ClassType... classTypes)
        Filter classes according to scan spec and class type.
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        strictAccept - If true, exclude class if it is external, if external classes are not enabled
        classTypes - the class types
        Returns:
        the filtered classes.
      • filterClassInfo

        private ClassInfo.ReachableAndDirectlyRelatedClasses filterClassInfo​(ClassInfo.RelType relType,
                                                                             boolean strictAccept,
                                                                             ClassInfo.ClassType... classTypes)
        Get the classes related to this one (the transitive closure) for the given relationship type, and those directly related.
        Parameters:
        relType - the relationship type
        strictAccept - If true, exclude class if it is external, if external classes are not enabled
        classTypes - the class types to accept
        Returns:
        the reachable and directly related classes
      • getAllClasses

        static ClassInfoList getAllClasses​(java.util.Collection<ClassInfo> classes,
                                           ScanSpec scanSpec)
        Get all classes found during the scan.
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        Returns:
        A list of all classes found during the scan, or the empty list if none.
      • getAllEnums

        static ClassInfoList getAllEnums​(java.util.Collection<ClassInfo> classes,
                                         ScanSpec scanSpec)
        Get all Enum classes found during the scan.
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        Returns:
        A list of all Enum classes found during the scan, or the empty list if none.
      • getAllRecords

        static ClassInfoList getAllRecords​(java.util.Collection<ClassInfo> classes,
                                           ScanSpec scanSpec)
        Get all record classes found during the scan.
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        Returns:
        A list of all record classes found during the scan, or the empty list if none.
      • getAllStandardClasses

        static ClassInfoList getAllStandardClasses​(java.util.Collection<ClassInfo> classes,
                                                   ScanSpec scanSpec)
        Get all standard classes found during the scan.
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        Returns:
        A list of all standard classes found during the scan, or the empty list if none.
      • getAllImplementedInterfaceClasses

        static ClassInfoList getAllImplementedInterfaceClasses​(java.util.Collection<ClassInfo> classes,
                                                               ScanSpec scanSpec)
        Get all implemented interface (non-annotation interface) classes found during the scan.
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        Returns:
        A list of all annotation classes found during the scan, or the empty list if none.
      • getAllAnnotationClasses

        static ClassInfoList getAllAnnotationClasses​(java.util.Collection<ClassInfo> classes,
                                                     ScanSpec scanSpec)
        Get all annotation classes found during the scan. See also #getAllInterfacesOrAnnotationClasses(Collection, ScanSpec, ScanResult) ()}.
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        Returns:
        A list of all annotation classes found during the scan, or the empty list if none.
      • getAllInterfacesOrAnnotationClasses

        static ClassInfoList getAllInterfacesOrAnnotationClasses​(java.util.Collection<ClassInfo> classes,
                                                                 ScanSpec scanSpec)
        Get all interface or annotation classes found during the scan. (Annotations are technically interfaces, and they can be implemented.)
        Parameters:
        classes - the classes
        scanSpec - the scan spec
        Returns:
        A list of all accepted interfaces found during the scan, or the empty list if none.
      • getName

        public java.lang.String getName()
        Get the name of the class.
        Specified by:
        getName in interface HasName
        Returns:
        The name of the class.
      • getSimpleName

        static java.lang.String getSimpleName​(java.lang.String className)
        Get simple name from fully-qualified class name. Returns everything after the last '.' or the last '$' in the class name, or the whole string if the class is in the root package. (Note that this is not the same as the result of Class.getSimpleName(), which returns "" for anonymous classes.)
        Parameters:
        className - the class name
        Returns:
        The simple name of the class.
      • getSimpleName

        public java.lang.String getSimpleName()
        Get the simple name of the class. Returns everything after the last '.' in the class name, or the whole string if the class is in the root package. (Note that this is not the same as the result of Class.getSimpleName(), which returns "" for anonymous classes.)
        Returns:
        The simple name of the class.
      • getModuleInfo

        public ModuleInfo getModuleInfo()
        Get the ModuleInfo object for the class.
        Returns:
        the ModuleInfo object for the class, or null if the class is not part of a named module.
      • getPackageInfo

        public PackageInfo getPackageInfo()
        Get the PackageInfo object for the class.
        Returns:
        the PackageInfo object for the package that contains the class.
      • getPackageName

        public java.lang.String getPackageName()
        Get the name of the class' package.
        Returns:
        The name of the class' package.
      • isExternalClass

        public boolean isExternalClass()
        Checks if this is an external class.
        Returns:
        true if this class is an external class, i.e. was referenced by an accepted class as a superclass, interface, or annotation, but is not itself an accepted class.
      • getClassfileMinorVersion

        public int getClassfileMinorVersion()
        Get the minor version of the classfile format for this class' classfile.
        Returns:
        The minor version of the classfile format for this class' classfile, or 0 if this ClassInfo object is a placeholder for a referenced class that was not found or not accepted during the scan.
      • getClassfileMajorVersion

        public int getClassfileMajorVersion()
        Get the major version of the classfile format for this class' classfile.
        Returns:
        The major version of the classfile format for this class' classfile, or 0 if this ClassInfo object is a placeholder for a referenced class that was not found or not accepted during the scan.
      • getModifiers

        public int getModifiers()
        Get the class modifier bits.
        Returns:
        The class modifier bits, e.g. Modifier.PUBLIC.
      • getModifiersStr

        public java.lang.String getModifiersStr()
        Get the class modifiers as a String.
        Returns:
        The field modifiers as a string, e.g. "public static final". For the modifier bits, call getModifiers().
      • isPublic

        public boolean isPublic()
        Checks if the class is public.
        Returns:
        true if this class is a public class.
      • isPrivate

        public boolean isPrivate()
        Checks if the class is private.
        Returns:
        true if this class is a private class.
      • isProtected

        public boolean isProtected()
        Checks if the class is protected.
        Returns:
        true if this class is a protected class.
      • isPackageVisible

        public boolean isPackageVisible()
        Checks if the class has default (package) visibility.
        Returns:
        true if this class is only visible within its package.
      • isAbstract

        public boolean isAbstract()
        Checks if the class is abstract.
        Returns:
        true if this class is an abstract class.
      • isSynthetic

        public boolean isSynthetic()
        Checks if the class is synthetic.
        Returns:
        true if this class is a synthetic class.
      • isFinal

        public boolean isFinal()
        Checks if the class is final.
        Returns:
        true if this class is a final class.
      • isStatic

        public boolean isStatic()
        Checks if the class is static.
        Returns:
        true if this class is static.
      • isAnnotation

        public boolean isAnnotation()
        Checks if the class is an annotation.
        Returns:
        true if this class is an annotation class.
      • isInterface

        public boolean isInterface()
        Checks if is the class an interface and is not an annotation.
        Returns:
        true if this class is an interface and is not an annotation (annotations are interfaces, and can be implemented).
      • isInterfaceOrAnnotation

        public boolean isInterfaceOrAnnotation()
        Checks if is an interface or an annotation.
        Returns:
        true if this class is an interface or an annotation (annotations are interfaces, and can be implemented).
      • isEnum

        public boolean isEnum()
        Checks if is the class is an Enum.
        Returns:
        true if this class is an Enum.
      • isRecord

        public boolean isRecord()
        Checks if is the class is a record (JDK 14+).
        Returns:
        true if this class is a record.
      • isStandardClass

        public boolean isStandardClass()
        Checks if this class is a standard class.
        Returns:
        true if this class is a standard class (i.e. is not an annotation or interface).
      • isArrayClass

        public boolean isArrayClass()
        Checks if this class is an array class. Returns false unless this ClassInfo is an instance of ArrayClassInfo.
        Returns:
        true if this is an array class.
      • extendsSuperclass

        public boolean extendsSuperclass​(java.lang.Class<?> superclass)
        Checks if this class extends the superclass.
        Parameters:
        superclass - A superclass.
        Returns:
        true if this class extends the superclass.
      • extendsSuperclass

        public boolean extendsSuperclass​(java.lang.String superclassName)
        Checks if this class extends the named superclass.
        Parameters:
        superclassName - The name of a superclass.
        Returns:
        true if this class extends the named superclass.
      • isInnerClass

        public boolean isInnerClass()
        Checks if this class is an inner class.
        Returns:
        true if this is an inner class (call isAnonymousInnerClass() to test if this is an anonymous inner class). If true, the containing class can be determined by calling getOuterClasses().
      • isOuterClass

        public boolean isOuterClass()
        Checks if this class is an outer class.
        Returns:
        true if this class contains inner classes. If true, the inner classes can be determined by calling getInnerClasses().
      • isAnonymousInnerClass

        public boolean isAnonymousInnerClass()
        Checks if this class is an anonymous inner class.
        Returns:
        true if this is an anonymous inner class. If true, the name of the containing method can be obtained by calling getFullyQualifiedDefiningMethodName().
      • isImplementedInterface

        public boolean isImplementedInterface()
        Checks whether this class is an implemented interface (meaning a standard, non-annotation interface, or an annotation that has also been implemented as an interface by some class).

        Annotations are interfaces, but you can also implement an annotation, so to we return whether an interface (even an annotation) is implemented by a class or extended by a subinterface, or (failing that) if it is not an interface but not an annotation.

        Returns:
        true if this class is an implemented interface.
      • implementsInterface

        public boolean implementsInterface​(java.lang.Class<?> interfaceClazz)
        Checks whether this class implements the interface.
        Parameters:
        interfaceClazz - An interface.
        Returns:
        true if this class implements the interface.
      • implementsInterface

        public boolean implementsInterface​(java.lang.String interfaceName)
        Checks whether this class implements the named interface.
        Parameters:
        interfaceName - The name of an interface.
        Returns:
        true if this class implements the named interface.
      • hasAnnotation

        public boolean hasAnnotation​(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
        Checks whether this class has the annotation.
        Parameters:
        annotation - An annotation.
        Returns:
        true if this class has the annotation.
      • hasAnnotation

        public boolean hasAnnotation​(java.lang.String annotationName)
        Checks whether this class has the named annotation.
        Parameters:
        annotationName - The name of an annotation.
        Returns:
        true if this class has the named annotation.
      • hasDeclaredField

        public boolean hasDeclaredField​(java.lang.String fieldName)
        Checks whether this class has the named declared field.
        Parameters:
        fieldName - The name of a field.
        Returns:
        true if this class declares a field of the given name.
      • hasField

        public boolean hasField​(java.lang.String fieldName)
        Checks whether this class or one of its superclasses has the named field.
        Parameters:
        fieldName - The name of a field.
        Returns:
        true if this class or one of its superclasses declares a field of the given name.
      • hasDeclaredFieldAnnotation

        public boolean hasDeclaredFieldAnnotation​(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
        Checks whether this class declares a field with the annotation.
        Parameters:
        annotation - A field annotation.
        Returns:
        true if this class declares a field with the annotation.
      • hasDeclaredFieldAnnotation

        public boolean hasDeclaredFieldAnnotation​(java.lang.String fieldAnnotationName)
        Checks whether this class declares a field with the named annotation.
        Parameters:
        fieldAnnotationName - The name of a field annotation.
        Returns:
        true if this class declares a field with the named annotation.
      • hasFieldAnnotation

        public boolean hasFieldAnnotation​(java.lang.Class<? extends java.lang.annotation.Annotation> fieldAnnotation)
        Checks whether this class or one of its superclasses declares a field with the annotation.
        Parameters:
        fieldAnnotation - A field annotation.
        Returns:
        true if this class or one of its superclasses declares a field with the annotation.
      • hasFieldAnnotation

        public boolean hasFieldAnnotation​(java.lang.String fieldAnnotationName)
        Checks whether this class or one of its superclasses declares a field with the named annotation.
        Parameters:
        fieldAnnotationName - The name of a field annotation.
        Returns:
        true if this class or one of its superclasses declares a field with the named annotation.
      • hasDeclaredMethod

        public boolean hasDeclaredMethod​(java.lang.String methodName)
        Checks whether this class declares a method of the given name.
        Parameters:
        methodName - The name of a method.
        Returns:
        true if this class declares a method of the given name.
      • hasMethod

        public boolean hasMethod​(java.lang.String methodName)
        Checks whether this class or one of its superclasses or interfaces declares a method of the given name.
        Parameters:
        methodName - The name of a method.
        Returns:
        true if this class or one of its superclasses or interfaces declares a method of the given name.
      • hasDeclaredMethodAnnotation

        public boolean hasDeclaredMethodAnnotation​(java.lang.Class<? extends java.lang.annotation.Annotation> methodAnnotation)
        Checks whether this class declares a method with the annotation.
        Parameters:
        methodAnnotation - A method annotation.
        Returns:
        true if this class declares a method with the annotation.
      • hasDeclaredMethodAnnotation

        public boolean hasDeclaredMethodAnnotation​(java.lang.String methodAnnotationName)
        Checks whether this class declares a method with the named annotation.
        Parameters:
        methodAnnotationName - The name of a method annotation.
        Returns:
        true if this class declares a method with the named annotation.
      • hasMethodAnnotation

        public boolean hasMethodAnnotation​(java.lang.Class<? extends java.lang.annotation.Annotation> methodAnnotation)
        Checks whether this class or one of its superclasses or interfaces declares a method with the annotation.
        Parameters:
        methodAnnotation - A method annotation.
        Returns:
        true if this class or one of its superclasses or interfaces declares a method with the annotation.
      • hasMethodAnnotation

        public boolean hasMethodAnnotation​(java.lang.String methodAnnotationName)
        Checks whether this class or one of its superclasses or interfaces declares a method with the named annotation.
        Parameters:
        methodAnnotationName - The name of a method annotation.
        Returns:
        true if this class or one of its superclasses or interfaces declares a method with the named annotation.
      • hasDeclaredMethodParameterAnnotation

        public boolean hasDeclaredMethodParameterAnnotation​(java.lang.Class<? extends java.lang.annotation.Annotation> methodParameterAnnotation)
        Checks whether this class declares a method with the annotation.
        Parameters:
        methodParameterAnnotation - A method annotation.
        Returns:
        true if this class declares a method with the annotation.
      • hasDeclaredMethodParameterAnnotation

        public boolean hasDeclaredMethodParameterAnnotation​(java.lang.String methodParameterAnnotationName)
        Checks whether this class declares a method with the named annotation.
        Parameters:
        methodParameterAnnotationName - The name of a method annotation.
        Returns:
        true if this class declares a method with the named annotation.
      • hasMethodParameterAnnotation

        public boolean hasMethodParameterAnnotation​(java.lang.Class<? extends java.lang.annotation.Annotation> methodParameterAnnotation)
        Checks whether this class or one of its superclasses or interfaces has a method with the annotation.
        Parameters:
        methodParameterAnnotation - A method annotation.
        Returns:
        true if this class or one of its superclasses or interfaces has a method with the annotation.
      • hasMethodParameterAnnotation

        public boolean hasMethodParameterAnnotation​(java.lang.String methodParameterAnnotationName)
        Checks whether this class or one of its superclasses or interfaces has a method with the named annotation.
        Parameters:
        methodParameterAnnotationName - The name of a method annotation.
        Returns:
        true if this class or one of its superclasses or interfaces has a method with the named annotation.
      • getFieldOverrideOrder

        private java.util.List<ClassInfo> getFieldOverrideOrder​(java.util.Set<ClassInfo> visited,
                                                                java.util.List<ClassInfo> overrideOrderOut)
        Recurse to interfaces and superclasses to get the order that fields are overridden in.
        Parameters:
        visited - visited
        overrideOrderOut - the override order
        Returns:
        the override order
      • getFieldOverrideOrder

        private java.util.List<ClassInfo> getFieldOverrideOrder()
        Get the order that fields are overridden in (base class first).
        Returns:
        the override order
      • getMethodOverrideOrder

        private java.util.List<ClassInfo> getMethodOverrideOrder​(java.util.Set<ClassInfo> visited,
                                                                 java.util.List<ClassInfo> overrideOrderOut)
        Recurse to collect classes and interfaces in the order of overridden methods, in descending priority.

        First collects all direct super classes, as their methods always have a higher priority than any method declared by an interface. Iterates over interfaces and inserts those extending already found interfaces before them in the output. The order of unrelated interfaces is unspecified.

        See Java Language Specification 8.4.8 for details.

        Parameters:
        visited - non-null set of already visited ClassInfos
        overrideOrderOut - non-null outgoing list of ClassInfos in descending override order.
        Returns:
        the overrideOrderOut instance
      • getMethodOverrideOrder

        private java.util.List<ClassInfo> getMethodOverrideOrder()
        Get the order that methods are overridden in.
        Returns:
        the override order
      • getSubclasses

        public ClassInfoList getSubclasses()
        Get the subclasses of this class, sorted in order of name. Call ClassInfoList.directOnly() to get direct subclasses. If this class represents Object, then returns only standard classes, not interfaces, since interfaces don't extend Object.
        Returns:
        the list of subclasses of this class, or the empty list if none.
      • getSuperclasses

        public ClassInfoList getSuperclasses()
        Get all superclasses of this class, in ascending order in the class hierarchy, not including Object for simplicity, since that is the superclass of all classes. Also does not include superinterfaces, if this is an interface (use getInterfaces() to get superinterfaces of an interface.}
        Returns:
        the list of all superclasses of this class, or the empty list if none.
      • getSuperclass

        public ClassInfo getSuperclass()
        Get the single direct superclass of this class, or null if none. Does not return the superinterfaces, if this is an interface (use getInterfaces() to get superinterfaces of an interface.}
        Returns:
        the superclass of this class, or null if none.
      • getOuterClasses

        public ClassInfoList getOuterClasses()
        Get the containing outer classes, if this is an inner class.
        Returns:
        A list of the containing outer classes, if this is an inner class, otherwise the empty list. Note that all containing outer classes are returned, not just the innermost of the containing outer classes.
      • getInnerClasses

        public ClassInfoList getInnerClasses()
        Get the inner classes contained within this class, if this is an outer class.
        Returns:
        A list of the inner classes contained within this class, or the empty list if none.
      • getFullyQualifiedDefiningMethodName

        public java.lang.String getFullyQualifiedDefiningMethodName()
        Gets fully-qualified method name (i.e. fully qualified classname, followed by dot, followed by method name) for the defining method, if this is an anonymous inner class.
        Returns:
        The fully-qualified method name (i.e. fully qualified classname, followed by dot, followed by method name) for the defining method, if this is an anonymous inner class, or null if not.
      • getInterfaces

        public ClassInfoList getInterfaces()
        Get the interfaces implemented by this class or by one of its superclasses, if this is a standard class, or the superinterfaces extended by this interface, if this is an interface.
        Returns:
        The list of interfaces implemented by this class or by one of its superclasses, if this is a standard class, or the superinterfaces extended by this interface, if this is an interface. Returns the empty list if none.
      • getClassesImplementing

        public ClassInfoList getClassesImplementing()
        Get the classes (and their subclasses) that implement this interface, if this is an interface.
        Returns:
        the list of the classes (and their subclasses) that implement this interface, if this is an interface, otherwise returns the empty list.
      • getAnnotations

        public ClassInfoList getAnnotations()
        Get the annotations and meta-annotations on this class. (Call getAnnotationInfo() instead, if you need the parameter values of annotations, rather than just the annotation classes.)

        Also handles the Inherited meta-annotation, which causes an annotation to annotate a class and all of its subclasses.

        Filters out meta-annotations in the java.lang.annotation package.

        Returns:
        the list of annotations and meta-annotations on this class.
      • getAnnotationInfo

        public AnnotationInfoList getAnnotationInfo()
        Get a list of the annotations on this class, or the empty list if none.

        Also handles the Inherited meta-annotation, which causes an annotation to annotate a class and all of its subclasses.

        Returns:
        A list of AnnotationInfo objects for the annotations on this class, or the empty list if none.
      • getAnnotationInfo

        public AnnotationInfo getAnnotationInfo​(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
        Get a the non-Repeatable annotation on this class, or null if the class does not have the annotation. (Use getAnnotationInfoRepeatable(String) for Repeatable annotations.)

        Also handles the Inherited meta-annotation, which causes an annotation to annotate a class and all of its subclasses.

        Note that if you need to get multiple annotations, it is faster to call getAnnotationInfo(), and then get the annotations from the returned AnnotationInfoList, so that the returned list doesn't have to be built multiple times.

        Parameters:
        annotation - The annotation.
        Returns:
        An AnnotationInfo object representing the annotation on this class, or null if the class does not have the annotation.
      • getAnnotationInfo

        public AnnotationInfo getAnnotationInfo​(java.lang.String annotationName)
        Get a the named non-Repeatable annotation on this class, or null if the class does not have the named annotation. (Use getAnnotationInfoRepeatable(String) for Repeatable annotations.)

        Also handles the Inherited meta-annotation, which causes an annotation to annotate a class and all of its subclasses.

        Note that if you need to get multiple named annotations, it is faster to call getAnnotationInfo(), and then get the named annotations from the returned AnnotationInfoList, so that the returned list doesn't have to be built multiple times.

        Parameters:
        annotationName - The annotation name.
        Returns:
        An AnnotationInfo object representing the named annotation on this class, or null if the class does not have the named annotation.
      • getAnnotationInfoRepeatable

        public AnnotationInfoList getAnnotationInfoRepeatable​(java.lang.Class<? extends java.lang.annotation.Annotation> annotation)
        Get a the Repeatable annotation on this class, or the empty list if the class does not have the annotation.

        Also handles the Inherited meta-annotation, which causes an annotation to annotate a class and all of its subclasses.

        Note that if you need to get multiple annotations, it is faster to call getAnnotationInfo(), and then get the annotations from the returned AnnotationInfoList, so that the returned list doesn't have to be built multiple times.

        Parameters:
        annotation - The annotation.
        Returns:
        An AnnotationInfoList of all instances of the annotation on this class, or the empty list if the class does not have the annotation.
      • getAnnotationInfoRepeatable

        public AnnotationInfoList getAnnotationInfoRepeatable​(java.lang.String annotationName)
        Get a the named Repeatable annotation on this class, or the empty list if the class does not have the named annotation.

        Also handles the Inherited meta-annotation, which causes an annotation to annotate a class and all of its subclasses.

        Note that if you need to get multiple named annotations, it is faster to call getAnnotationInfo(), and then get the named annotations from the returned AnnotationInfoList, so that the returned list doesn't have to be built multiple times.

        Parameters:
        annotationName - The annotation name.
        Returns:
        An AnnotationInfoList of all instances of the named annotation on this class, or the empty list if the class does not have the named annotation.
      • getAnnotationDefaultParameterValues

        public AnnotationParameterValueList getAnnotationDefaultParameterValues()
        Get the default parameter values for this annotation, if this is an annotation class.
        Returns:
        A list of AnnotationParameterValue objects for each of the default parameter values for this annotation, if this is an annotation class with default parameter values, otherwise the empty list.
      • getClassesWithAnnotation

        public ClassInfoList getClassesWithAnnotation()
        Get the classes that have this class as an annotation.
        Returns:
        A list of standard classes and non-annotation interfaces that are annotated by this class, if this is an annotation class, or the empty list if none. Also handles the Inherited meta-annotation, which causes an annotation on a class to be inherited by all of its subclasses.
      • getClassesWithAnnotationDirectOnly

        ClassInfoList getClassesWithAnnotationDirectOnly()
        Get the classes that have this class as a direct annotation.
        Returns:
        The list of classes that are directly (i.e. are not meta-annotated) annotated with the requested annotation, or the empty list if none.
      • getDeclaredMethodInfo

        private MethodInfoList getDeclaredMethodInfo​(java.lang.String methodName,
                                                     boolean getNormalMethods,
                                                     boolean getConstructorMethods,
                                                     boolean getStaticInitializerMethods)
        Get the declared methods, constructors, and/or static initializer methods of the class.
        Parameters:
        methodName - the method name
        getNormalMethods - whether to get normal methods
        getConstructorMethods - whether to get constructor methods
        getStaticInitializerMethods - whether to get static initializer methods
        Returns:
        the declared method info
      • getMethodInfo

        private MethodInfoList getMethodInfo​(java.lang.String methodName,
                                             boolean getNormalMethods,
                                             boolean getConstructorMethods,
                                             boolean getStaticInitializerMethods)
        Get the methods, constructors, and/or static initializer methods of the class.
        Parameters:
        methodName - the method name
        getNormalMethods - whether to get normal methods
        getConstructorMethods - whether to get constructor methods
        getStaticInitializerMethods - whether to get static initializer methods
        Returns:
        the method info
      • getMethodAnnotations

        public ClassInfoList getMethodAnnotations()
        Get all method annotations.
        Returns:
        A list of all annotations or meta-annotations on methods declared by the class, (not including methods declared by the interfaces or superclasses of this class), as a list of ClassInfo objects, or the empty list if none. N.B. these annotations do not contain specific annotation parameters -- call ClassMemberInfo.getAnnotationInfo() to get details on specific method annotation instances.
      • getMethodParameterAnnotations

        public ClassInfoList getMethodParameterAnnotations()
        Get all method parameter annotations.
        Returns:
        A list of all annotations or meta-annotations on methods declared by the class, (not including methods declared by the interfaces or superclasses of this class), as a list of ClassInfo objects, or the empty list if none. N.B. these annotations do not contain specific annotation parameters -- call ClassMemberInfo.getAnnotationInfo() to get details on specific method annotation instances.
      • getClassesWithMethodAnnotation

        public ClassInfoList getClassesWithMethodAnnotation()
        Get all classes that have this class as a method annotation, and their subclasses, if the method is non-private.
        Returns:
        A list of classes that have a declared method with this annotation or meta-annotation, or the empty list if none.
      • getClassesWithMethodParameterAnnotation

        public ClassInfoList getClassesWithMethodParameterAnnotation()
        Get all classes that have this class as a method parameter annotation, and their subclasses, if the method is non-private.
        Returns:
        A list of classes that have a declared method with a parameter that is annotated with this annotation or meta-annotation, or the empty list if none.
      • getClassesWithMethodAnnotationDirectOnly

        ClassInfoList getClassesWithMethodAnnotationDirectOnly()
        Get the classes that have this class as a direct method annotation.
        Returns:
        A list of classes that declare methods that are directly annotated (i.e. are not meta-annotated) with the requested method annotation, or the empty list if none.
      • getClassesWithMethodParameterAnnotationDirectOnly

        ClassInfoList getClassesWithMethodParameterAnnotationDirectOnly()
        Get the classes that have this class as a direct method parameter annotation.
        Returns:
        A list of classes that declare methods with parameters that are directly annotated (i.e. are not meta-annotated) with the requested method annotation, or the empty list if none.
      • getEnumConstants

        public FieldInfoList getEnumConstants()
        Returns:
        All enum constants of an enum class as a list of FieldInfo objects (enum constants are stored as fields in Java classes).
      • getEnumConstantObjects

        public java.util.List<java.lang.Object> getEnumConstantObjects()
        Returns:
        All enum constants of an enum class as a list of objects of the same type as the enum.
      • getFieldAnnotations

        public ClassInfoList getFieldAnnotations()
        Get all field annotations.
        Returns:
        A list of all annotations on fields of this class, or the empty list if none. N.B. these annotations do not contain specific annotation parameters -- call ClassMemberInfo.getAnnotationInfo() to get details on specific field annotation instances.
      • getClassesWithFieldAnnotation

        public ClassInfoList getClassesWithFieldAnnotation()
        Get the classes that have this class as a field annotation or meta-annotation.
        Returns:
        A list of classes that have a field with this annotation or meta-annotation, or the empty list if none.
      • getClassesWithFieldAnnotationDirectOnly

        ClassInfoList getClassesWithFieldAnnotationDirectOnly()
        Get the classes that have this class as a direct field annotation.
        Returns:
        A list of classes that declare fields that are directly annotated (i.e. are not meta-annotated) with the requested method annotation, or the empty list if none.
      • getTypeSignature

        public ClassTypeSignature getTypeSignature()
        Get the parsed type signature for the class.
        Returns:
        The parsed type signature for the class, including any generic type parameters, or null if not available (probably indicating the class is not generic).
        Throws:
        java.lang.IllegalArgumentException - if the class type signature cannot be parsed (this should only be thrown in the case of classfile corruption, or a compiler bug that causes an invalid type signature to be written to the classfile).
      • getTypeSignatureStr

        public java.lang.String getTypeSignatureStr()
        Get the type signature string for the class.
        Returns:
        The type signature string for the class, including any generic type parameters, or null if not available (probably indicating the class is not generic).
      • getTypeSignatureOrTypeDescriptor

        public ClassTypeSignature getTypeSignatureOrTypeDescriptor()
        Returns the parsed type signature for this class, possibly including type parameters. If the type signature is not present for this class, indicating that this is not a generic class, then a type descriptor will be synthesized and returned, as if there were a type descriptor (classfiles may have a type signature but do not contain a type descriptor). May include type annotations on the superclass or interface(s).
        Returns:
        The parsed generic type signature for the class, or if not available, the synthetic type descriptor for the class.
      • getTypeDescriptor

        public ClassTypeSignature getTypeDescriptor()
        Returns a synthetic type descriptor for the method, created from the class name, superclass name, and implemented interfaces. May include type annotations on the superclass or interface(s).
        Returns:
        The synthetic type descriptor for the class.
      • getSourceFile

        public java.lang.String getSourceFile()
        Returns the name of the source file this class has been compiled from, such as ClassInfo.java or KClass.kt.

        This field may be null.

        Returns:
        The name of the source file of this class, or null if not available
      • getClasspathElementURI

        public java.net.URI getClasspathElementURI()
        Get the URI of the classpath element that this class was found within.
        Returns:
        The URI of the classpath element that this class was found within.
        Throws:
        java.lang.IllegalArgumentException - if the classpath element does not have a valid URI (e.g. for modules whose location URI is null).
      • getClasspathElementURL

        public java.net.URL getClasspathElementURL()
        Get the URL of the classpath element or module that this class was found within. Use getClasspathElementURI() instead if the resource may have come from a system module, or if this is a jlink'd runtime image, since "jrt:" URI schemes used by system modules and jlink'd runtime images are not suppored by URL, and this will cause IllegalArgumentException to be thrown.
        Returns:
        The URL of the classpath element that this class was found within.
        Throws:
        java.lang.IllegalArgumentException - if the classpath element URI cannot be converted to a URL (in particular, if the URI has a jrt:/ scheme).
      • getClasspathElementFile

        public java.io.File getClasspathElementFile()
        Get the File for the classpath element package root dir or jar that this class was found within, or null if this class was found in a module. (See also getModuleRef().)
        Returns:
        The File for the classpath element package root dir or jar that this class was found within, or null if this class was found in a module (see getModuleRef()). May also return null if the classpath element was an http/https URL, and the jar was downloaded directly to RAM, rather than to a temp file on disk (e.g. if the temp dir is not writeable).
      • getModuleRef

        public ModuleRef getModuleRef()
        Get the module that this class was found within, as a ModuleRef, or null if this class was found in a directory or jar in the classpath. (See also getClasspathElementFile().)
        Returns:
        The module that this class was found within, as a ModuleRef, or null if this class was found in a directory or jar in the classpath. (See also getClasspathElementFile().)
      • getResource

        public Resource getResource()
        The Resource for the classfile of this class.
        Returns:
        The Resource for the classfile of this class. Returns null if the classfile for this class was not actually read during the scan, e.g. because this class was not itself accepted, but was referenced by an accepted class.
      • loadClass

        public <T> java.lang.Class<T> loadClass​(java.lang.Class<T> superclassOrInterfaceType,
                                                boolean ignoreExceptions)
        Obtain a Class<?> reference for the class named by this ClassInfo object, casting it to the requested interface or superclass type. Causes the ClassLoader to load the class, if it is not already loaded.

        Important note: since superclassOrInterfaceType is a class reference for an already-loaded class, it is critical that superclassOrInterfaceType is loaded by the same classloader as the class referred to by this ClassInfo object, otherwise the class cast will fail.

        Overrides:
        loadClass in class ScanResultObject
        Type Parameters:
        T - the superclass or interface type
        Parameters:
        superclassOrInterfaceType - The Class reference for the type to cast the loaded class to.
        ignoreExceptions - If true, return null if any exceptions or errors thrown during classloading, or if attempting to cast the resulting Class<?> reference to the requested superclass or interface type fails. If false, IllegalArgumentException is thrown if the class could not be loaded or could not be cast to the requested type.
        Returns:
        The class reference, or null, if ignoreExceptions is true and there was an exception or error loading the class.
        Throws:
        java.lang.IllegalArgumentException - if ignoreExceptions is false and there were problems loading the class, or casting it to the requested type.
      • loadClass

        public <T> java.lang.Class<T> loadClass​(java.lang.Class<T> superclassOrInterfaceType)
        Obtain a Class<?> reference for the class named by this ClassInfo object, casting it to the requested interface or superclass type. Causes the ClassLoader to load the class, if it is not already loaded.

        Important note: since superclassOrInterfaceType is a class reference for an already-loaded class, it is critical that superclassOrInterfaceType is loaded by the same classloader as the class referred to by this ClassInfo object, otherwise the class cast will fail.

        Overrides:
        loadClass in class ScanResultObject
        Type Parameters:
        T - The superclass or interface type
        Parameters:
        superclassOrInterfaceType - The type to cast the loaded class to.
        Returns:
        The class reference.
        Throws:
        java.lang.IllegalArgumentException - if there were problems loading the class or casting it to the requested type.
      • loadClass

        public java.lang.Class<?> loadClass​(boolean ignoreExceptions)
        Obtain a Class<?> reference for the class named by this ClassInfo object. Causes the ClassLoader to load the class, if it is not already loaded.
        Overrides:
        loadClass in class ScanResultObject
        Parameters:
        ignoreExceptions - Whether or not to ignore exceptions
        Returns:
        The class reference, or null, if ignoreExceptions is true and there was an exception or error loading the class.
        Throws:
        java.lang.IllegalArgumentException - if ignoreExceptions is false and there were problems loading the class.
      • loadClass

        public java.lang.Class<?> loadClass()
        Obtain a Class<?> reference for the class named by this ClassInfo object. Causes the ClassLoader to load the class, if it is not already loaded.
        Overrides:
        loadClass in class ScanResultObject
        Returns:
        The class reference.
        Throws:
        java.lang.IllegalArgumentException - if there were problems loading the class.
      • getClassInfo

        protected ClassInfo getClassInfo()
        Description copied from class: ScanResultObject
        Get the ClassInfo object for the referenced class, or null if the referenced class was not encountered during scanning (i.e. no ClassInfo object was created for the class during scanning). N.B. even if this method returns null, ScanResultObject.loadClass() may be able to load the referenced class by name.
        Overrides:
        getClassInfo in class ScanResultObject
        Returns:
        The ClassInfo object for the referenced class.
      • setScanResult

        void setScanResult​(ScanResult scanResult)
        Description copied from class: ScanResultObject
        Set ScanResult backreferences in info objects after scan has completed.
        Overrides:
        setScanResult in class ScanResultObject
        Parameters:
        scanResult - the scan result
      • handleRepeatableAnnotations

        void handleRepeatableAnnotations​(java.util.Set<java.lang.String> allRepeatableAnnotationNames)
        Handle Repeatable annotations.
        Parameters:
        allRepeatableAnnotationNames - the names of all repeatable annotations
      • addReferencedClassNames

        void addReferencedClassNames​(java.util.Set<java.lang.String> refdClassNames)
        Add names of classes referenced by this class.
        Parameters:
        refdClassNames - the referenced class names
      • findReferencedClassInfo

        protected void findReferencedClassInfo​(java.util.Map<java.lang.String,​ClassInfo> classNameToClassInfo,
                                               java.util.Set<ClassInfo> refdClassInfo,
                                               LogNode log)
        Get ClassInfo objects for any classes referenced in this class' type descriptor, or the type descriptors of fields, methods or annotations.
        Overrides:
        findReferencedClassInfo in class ScanResultObject
        Parameters:
        classNameToClassInfo - the map from class name to ClassInfo.
        refdClassInfo - the referenced class info
        log - the log
      • setReferencedClasses

        void setReferencedClasses​(ClassInfoList refdClasses)
        Set the list of ClassInfo objects for classes referenced by this class.
        Parameters:
        refdClasses - the referenced classes
      • compareTo

        public int compareTo​(ClassInfo o)
        Compare based on class name.
        Specified by:
        compareTo in interface java.lang.Comparable<ClassInfo>
        Parameters:
        o - the other object
        Returns:
        the comparison result
      • equals

        public boolean equals​(java.lang.Object obj)
        Use class name for equals().
        Overrides:
        equals in class java.lang.Object
        Parameters:
        obj - the other object
        Returns:
        Whether the objects were equal.
      • hashCode

        public int hashCode()
        Use hash code of class name.
        Overrides:
        hashCode in class java.lang.Object
        Returns:
        the hashcode
      • toString

        protected void toString​(boolean useSimpleNames,
                                java.lang.StringBuilder buf)
        To string.
        Specified by:
        toString in class ScanResultObject
        Parameters:
        useSimpleNames - use simple names
        buf - the buf