class ArrayClassInfo extends ClassInfo {
    /** The array type signature. */
    private ArrayTypeSignature arrayTypeSignature;

    /** The element class info. */
    private ClassInfo elementClassInfo;

    /** Default constructor for deserialization. */
    ArrayClassInfo() {
        super();
    }

    /**
     * Constructor.
     *
     * @param arrayTypeSignature
     *            the array type signature
     */
    ArrayClassInfo(final ArrayTypeSignature arrayTypeSignature) {
        super(arrayTypeSignature.getClassName(), /* modifiers = */ 0, /* resource = */ null);
        this.arrayTypeSignature = arrayTypeSignature;
        // Pre-load fields from element type
        getElementClassInfo();
    }

    /* (non-Javadoc)
     * @see io.github.classgraph.ClassInfo#setScanResult(io.github.classgraph.ScanResult)
     */
    @Override
    void setScanResult(final ScanResult scanResult) {
        super.setScanResult(scanResult);
    }

    // -------------------------------------------------------------------------------------------------------------

    /**
     * Get the raw type signature string of the array class, e.g. "[[I" for "int[][]".
     *
     * @return The raw type signature string of the array class.
     */
    @Override
    public String getTypeSignatureStr() {
        return arrayTypeSignature.getTypeSignatureStr();
    }

    /**
     * Returns null, because array classes do not have a ClassTypeSignature. Call {@link #getArrayTypeSignature()}
     * instead.
     *
     * @return null (always).
     */
    @Override
    public ClassTypeSignature getTypeSignature() {
        return null;
    }

    /**
     * Get the type signature of the class.
     *
     * @return The class type signature, if available, otherwise returns null.
     */
    public ArrayTypeSignature getArrayTypeSignature() {
        return arrayTypeSignature;
    }

    /**
     * Get the type signature of the array elements.
     *
     * @return The type signature of the array elements.
     */
    public TypeSignature getElementTypeSignature() {
        return arrayTypeSignature.getElementTypeSignature();
    }

    /**
     * Get the number of dimensions of the array.
     *
     * @return The number of dimensions of the array.
     */
    public int getNumDimensions() {
        return arrayTypeSignature.getNumDimensions();
    }

    // -------------------------------------------------------------------------------------------------------------

    /**
     * Get the {@link ClassInfo} instance for the array element type.
     *
     * @return the {@link ClassInfo} instance for the array element type. Returns null if the element type was not
     *         found during the scan. In particular, will return null for arrays that have a primitive element type.
     */
    public ClassInfo getElementClassInfo() {<FILL_FUNCTION_BODY>}

    // -------------------------------------------------------------------------------------------------------------

    /**
     * Get a {@code Class<?>} reference for the array element type. Causes the ClassLoader to load the element
     * class, if it is not already loaded.
     *
     * @param ignoreExceptions
     *            Whether or not to ignore exceptions.
     * @return a {@code Class<?>} reference for the array element type. Also works for arrays of primitive element
     *         type.
     */
    public Class<?> loadElementClass(final boolean ignoreExceptions) {
        return arrayTypeSignature.loadElementClass(ignoreExceptions);
    }

    /**
     * Get a {@code Class<?>} reference for the array element type. Causes the ClassLoader to load the element
     * class, if it is not already loaded.
     *
     * @return a {@code Class<?>} reference for the array element type. Also works for arrays of primitive element
     *         type.
     */
    public Class<?> loadElementClass() {
        return arrayTypeSignature.loadElementClass();
    }

    /**
     * Obtain a {@code Class<?>} reference for the array class named by this {@link ArrayClassInfo} object. Causes
     * the ClassLoader to load the element class, if it is not already loaded.
     *
     * @param ignoreExceptions
     *            Whether or not to ignore exceptions
     * @return The class reference, or null, if ignoreExceptions is true and there was an exception or error loading
     *         the class.
     * @throws IllegalArgumentException
     *             if ignoreExceptions is false and there were problems loading the class.
     */
    @Override
    public Class<?> loadClass(final boolean ignoreExceptions) {
        if (classRef == null) {
            classRef = arrayTypeSignature.loadClass(ignoreExceptions);
        }
        return classRef;
    }

    /**
     * Obtain a {@code Class<?>} reference for the array class named by this {@link ArrayClassInfo} object. Causes
     * the ClassLoader to load the element class, if it is not already loaded.
     * 
     * @return The class reference.
     * @throws IllegalArgumentException
     *             if there were problems loading the class.
     */
    @Override
    public Class<?> loadClass() {
        if (classRef == null) {
            classRef = arrayTypeSignature.loadClass();
        }
        return classRef;
    }

    // -------------------------------------------------------------------------------------------------------------

    /**
     * Get {@link ClassInfo} objects for any classes referenced in the type descriptor or type signature.
     *
     * @param classNameToClassInfo
     *            the map from class name to {@link ClassInfo}.
     * @param refdClassInfo
     *            the referenced class info
     */
    @Override
    protected void findReferencedClassInfo(final Map<String, ClassInfo> classNameToClassInfo,
            final Set<ClassInfo> refdClassInfo, final LogNode log) {
        super.findReferencedClassInfo(classNameToClassInfo, refdClassInfo, log);
    }

    // -------------------------------------------------------------------------------------------------------------

    /* (non-Javadoc)
     * @see io.github.classgraph.ClassInfo#equals(java.lang.Object)
     */
    @Override
    public boolean equals(final Object obj) {
        return super.equals(obj);
    }

    /* (non-Javadoc)
     * @see io.github.classgraph.ClassInfo#hashCode()
     */
    @Override
    public int hashCode() {
        return super.hashCode();
    }
}

        if (elementClassInfo == null) {
            final TypeSignature elementTypeSignature = arrayTypeSignature.getElementTypeSignature();
            if (!(elementTypeSignature instanceof BaseTypeSignature)) {
                elementClassInfo = arrayTypeSignature.getElementTypeSignature().getClassInfo();
                if (elementClassInfo != null) {
                    // Copy over relevant fields from array element ClassInfo
                    this.classpathElement = elementClassInfo.classpathElement;
                    this.classfileResource = elementClassInfo.classfileResource;
                    this.classLoader = elementClassInfo.classLoader;
                    this.isScannedClass = elementClassInfo.isScannedClass;
                    this.isExternalClass = elementClassInfo.isExternalClass;
                    this.moduleInfo = elementClassInfo.moduleInfo;
                    this.packageInfo = elementClassInfo.packageInfo;
                }
            }
        }
        return elementClassInfo;
    
<methods>public int compareTo(io.github.classgraph.ClassInfo) ,public boolean equals(java.lang.Object) ,public boolean extendsSuperclass(Class<?>) ,public boolean extendsSuperclass(java.lang.String) ,public io.github.classgraph.AnnotationParameterValueList getAnnotationDefaultParameterValues() ,public io.github.classgraph.AnnotationInfoList getAnnotationInfo() ,public io.github.classgraph.AnnotationInfo getAnnotationInfo(Class<? extends java.lang.annotation.Annotation>) ,public io.github.classgraph.AnnotationInfo getAnnotationInfo(java.lang.String) ,public io.github.classgraph.AnnotationInfoList getAnnotationInfoRepeatable(Class<? extends java.lang.annotation.Annotation>) ,public io.github.classgraph.AnnotationInfoList getAnnotationInfoRepeatable(java.lang.String) ,public io.github.classgraph.ClassInfoList getAnnotations() ,public io.github.classgraph.ClassInfoList getClassDependencies() ,public io.github.classgraph.ClassInfoList getClassesImplementing() ,public io.github.classgraph.ClassInfoList getClassesWithAnnotation() ,public io.github.classgraph.ClassInfoList getClassesWithFieldAnnotation() ,public io.github.classgraph.ClassInfoList getClassesWithMethodAnnotation() ,public io.github.classgraph.ClassInfoList getClassesWithMethodParameterAnnotation() ,public int getClassfileMajorVersion() ,public int getClassfileMinorVersion() ,public java.io.File getClasspathElementFile() ,public java.net.URI getClasspathElementURI() ,public java.net.URL getClasspathElementURL() ,public io.github.classgraph.MethodInfoList getConstructorInfo() ,public io.github.classgraph.MethodInfoList getDeclaredConstructorInfo() ,public io.github.classgraph.FieldInfoList getDeclaredFieldInfo() ,public io.github.classgraph.FieldInfo getDeclaredFieldInfo(java.lang.String) ,public io.github.classgraph.MethodInfoList getDeclaredMethodAndConstructorInfo() ,public io.github.classgraph.MethodInfoList getDeclaredMethodInfo() ,public io.github.classgraph.MethodInfoList getDeclaredMethodInfo(java.lang.String) ,public List<java.lang.Object> getEnumConstantObjects() ,public io.github.classgraph.FieldInfoList getEnumConstants() ,public io.github.classgraph.ClassInfoList getFieldAnnotations() ,public io.github.classgraph.FieldInfoList getFieldInfo() ,public io.github.classgraph.FieldInfo getFieldInfo(java.lang.String) ,public java.lang.String getFullyQualifiedDefiningMethodName() ,public io.github.classgraph.ClassInfoList getInnerClasses() ,public io.github.classgraph.ClassInfoList getInterfaces() ,public io.github.classgraph.MethodInfoList getMethodAndConstructorInfo() ,public io.github.classgraph.ClassInfoList getMethodAnnotations() ,public io.github.classgraph.MethodInfoList getMethodInfo() ,public io.github.classgraph.MethodInfoList getMethodInfo(java.lang.String) ,public io.github.classgraph.ClassInfoList getMethodParameterAnnotations() ,public int getModifiers() ,public java.lang.String getModifiersStr() ,public io.github.classgraph.ModuleInfo getModuleInfo() ,public io.github.classgraph.ModuleRef getModuleRef() ,public java.lang.String getName() ,public io.github.classgraph.ClassInfoList getOuterClasses() ,public io.github.classgraph.PackageInfo getPackageInfo() ,public java.lang.String getPackageName() ,public io.github.classgraph.Resource getResource() ,public java.lang.String getSimpleName() ,public java.lang.String getSourceFile() ,public io.github.classgraph.ClassInfoList getSubclasses() ,public io.github.classgraph.ClassInfo getSuperclass() ,public io.github.classgraph.ClassInfoList getSuperclasses() ,public io.github.classgraph.ClassTypeSignature getTypeDescriptor() ,public io.github.classgraph.ClassTypeSignature getTypeSignature() ,public io.github.classgraph.ClassTypeSignature getTypeSignatureOrTypeDescriptor() ,public java.lang.String getTypeSignatureStr() ,public boolean hasAnnotation(Class<? extends java.lang.annotation.Annotation>) ,public boolean hasAnnotation(java.lang.String) ,public boolean hasDeclaredField(java.lang.String) ,public boolean hasDeclaredFieldAnnotation(Class<? extends java.lang.annotation.Annotation>) ,public boolean hasDeclaredFieldAnnotation(java.lang.String) ,public boolean hasDeclaredMethod(java.lang.String) ,public boolean hasDeclaredMethodAnnotation(Class<? extends java.lang.annotation.Annotation>) ,public boolean hasDeclaredMethodAnnotation(java.lang.String) ,public boolean hasDeclaredMethodParameterAnnotation(Class<? extends java.lang.annotation.Annotation>) ,public boolean hasDeclaredMethodParameterAnnotation(java.lang.String) ,public boolean hasField(java.lang.String) ,public boolean hasFieldAnnotation(Class<? extends java.lang.annotation.Annotation>) ,public boolean hasFieldAnnotation(java.lang.String) ,public boolean hasMethod(java.lang.String) ,public boolean hasMethodAnnotation(Class<? extends java.lang.annotation.Annotation>) ,public boolean hasMethodAnnotation(java.lang.String) ,public boolean hasMethodParameterAnnotation(Class<? extends java.lang.annotation.Annotation>) ,public boolean hasMethodParameterAnnotation(java.lang.String) ,public int hashCode() ,public boolean implementsInterface(Class<?>) ,public boolean implementsInterface(java.lang.String) ,public boolean isAbstract() ,public boolean isAnnotation() ,public boolean isAnonymousInnerClass() ,public boolean isArrayClass() ,public boolean isEnum() ,public boolean isExternalClass() ,public boolean isFinal() ,public boolean isImplementedInterface() ,public boolean isInnerClass() ,public boolean isInterface() ,public boolean isInterfaceOrAnnotation() ,public boolean isOuterClass() ,public boolean isPackageVisible() ,public boolean isPrivate() ,public boolean isProtected() ,public boolean isPublic() ,public boolean isRecord() ,public boolean isStandardClass() ,public boolean isStatic() ,public boolean isSynthetic() ,public Class<T> loadClass(Class<T>, boolean) ,public Class<T> loadClass(Class<T>) ,public Class<?> loadClass(boolean) ,public Class<?> loadClass() <variables>private static final int ANNOTATION_CLASS_MODIFIER,private static final io.github.classgraph.ClassInfo.ReachableAndDirectlyRelatedClasses NO_REACHABLE_CLASSES,io.github.classgraph.AnnotationParameterValueList annotationDefaultParamValues,transient boolean annotationDefaultParamValuesHasBeenConvertedToPrimitive,io.github.classgraph.AnnotationInfoList annotationInfo,transient java.lang.ClassLoader classLoader,private int classfileMajorVersion,private int classfileMinorVersion,protected transient io.github.classgraph.Resource classfileResource,transient io.github.classgraph.ClasspathElement classpathElement,io.github.classgraph.FieldInfoList fieldInfo,private java.lang.String fullyQualifiedDefiningMethodName,protected boolean isExternalClass,boolean isInherited,private boolean isRecord,protected boolean isScannedClass,io.github.classgraph.MethodInfoList methodInfo,private transient List<io.github.classgraph.ClassInfo> methodOverrideOrder,private int modifiers,io.github.classgraph.ModuleInfo moduleInfo,protected java.lang.String name,private transient List<io.github.classgraph.ClassInfo> overrideOrder,io.github.classgraph.PackageInfo packageInfo,private Set<java.lang.String> referencedClassNames,private io.github.classgraph.ClassInfoList referencedClasses,private Map<io.github.classgraph.ClassInfo.RelType,Set<io.github.classgraph.ClassInfo>> relatedClasses,private java.lang.String sourceFile,transient List<io.github.classgraph.Classfile.ClassTypeAnnotationDecorator> typeAnnotationDecorators,private transient io.github.classgraph.ClassTypeSignature typeDescriptor,private transient io.github.classgraph.ClassTypeSignature typeSignature,protected java.lang.String typeSignatureStr