Class ClassInfo

java.lang.Object
org.jboss.jandex.ClassInfo
All Implemented Interfaces:
AnnotationTarget, Declaration, Descriptor, GenericSignature

public final class ClassInfo extends Object implements Declaration, Descriptor, GenericSignature
Represents a class entry in an index. A ClassInfo is only a partial view of a Java class, it is not intended as a complete replacement for Java reflection.

Global information including the parent class, implemented interfaces, and access flags are also provided since this information is often necessary. Implicitly declared (aka mandated) and synthetic members are included as well.

Note that a parent class and interface may exist outside of the scope of the index (e.g. classes in a different jar) so the references are stored as names instead of direct references. It is expected that multiple indexes may need to be queried to assemble a full hierarchy in a complex multi-jar environment (e.g. an application server).

Thread-Safety

This class is immutable and can be shared between threads without safe publication.
Author:
Jason T. Greene
  • Method Details

    • create

      @Deprecated public static ClassInfo create(DotName name, DotName superName, short flags, DotName[] interfaces, Map<DotName,List<AnnotationInstance>> annotations, boolean hasNoArgsConstructor)
      Deprecated.
      Constructs a "mock" ClassInfo using the passed values. All passed values MUST NOT BE MODIFIED AFTER THIS CALL. Otherwise the resulting object would not conform to the contract outlined above.
      Parameters:
      name - the name of this class
      superName - the name of the parent class
      flags - the class attributes
      interfaces - the interfaces this class implements
      annotations - the annotations on this class
      hasNoArgsConstructor - whether this class has a no arg constructor
      Returns:
      a new mock class representation
    • kind

      public final AnnotationTarget.Kind kind()
      Description copied from interface: AnnotationTarget
      Returns the kind of object this target represents.
      Specified by:
      kind in interface AnnotationTarget
      Returns:
      the target kind.
    • toString

      public String toString()
      Returns the binary name of this class.
      Overrides:
      toString in class Object
      Returns:
      the binary name of this class
    • name

      public final DotName name()
      Returns the binary name of the class as a DotName.
      Returns:
      the binary name of the class as a DotName
    • flags

      public final short flags()
      Returns the access flags for this class. The Modifier methods can be used to decode the value.
      Returns:
      the access flags
    • isSynthetic

      public final boolean isSynthetic()
      Returns:
      true if this class is a synthetic class
    • isInterface

      public final boolean isInterface()
      Returns:
      true if this class object represents an interface type
    • isEnum

      public final boolean isEnum()
      Returns:
      true if this class object represents an enum type
    • isAnnotation

      public final boolean isAnnotation()
      Returns:
      true if this class object represents an annotation type
    • isRecord

      public final boolean isRecord()
      Returns:
      true if this class object represents a record type
    • isModule

      public final boolean isModule()
      Returns:
      true if this class object represents a Java module descriptor
    • superName

      public final DotName superName()
      Returns the name of the super class declared by the extends clause of this class. This information is also available from the superClassType method. For all classes, with the one exception of java.lang.Object, which is the one class in the Java language without a super-type, this method will always return a non-null value.
      Returns:
      the name of the super class of this class, or null if this class is java.lang.Object
    • interfaces

      @Deprecated public final DotName[] interfaces()
      Deprecated.
      Returns an array of interface names implemented by this class. Every call to this method performs a defensive copy, so interfaceNames() should be used instead.
      Returns:
      an array of interface names implemented by this class
    • hasAnnotation

      public final boolean hasAnnotation(DotName name)
      Returns whether an annotation instance with given name is declared on this class, any of its members, or any type within the signature of the class or its members.
      Specified by:
      hasAnnotation in interface AnnotationTarget
      Parameters:
      name - name of the annotation type to look for, must not be null
      Returns:
      true if the annotation is present, false otherwise
      Since:
      3.0
      See Also:
    • annotation

      public final AnnotationInstance annotation(DotName name)
      Returns the annotation instance with given name declared on this class, any of its members, or any type within the signature of the class or its members. The target() method of the returned annotation instance may be used to determine the exact location of the annotation instance.

      The following is a non-exhaustive list of examples of annotations returned by this method:

       @MyClassAnnotation
       public class Foo<@MyTypeAnnotation T> {
           @MyFieldAnnotation
           public String foo;
      
           public List<@MyTypeAnnotation String> bar;
      
           @MyMethodAnnotation
           public void foo() {...}
      
           public void foo(@MyParamAnnotation int param) {...}
      
           public void foo(List<@MyTypeAnnotation String> list) {...}
      
           public <@MyTypeAnnotation T> void foo(T t) {...}
       }
       

      In case an annotation with given name occurs more than once, the result of this method is not deterministic. For such situations, annotations(DotName) is preferable.

      Specified by:
      annotation in interface AnnotationTarget
      Parameters:
      name - name of the annotation type to look for, must not be null
      Returns:
      the annotation instance, or null if not found
      Since:
      3.0
      See Also:
    • annotations

      public final List<AnnotationInstance> annotations(DotName name)
      Returns the annotation instances with given name declared on this class, any of its members, or any type within the signature of the class or its members. The target() method of the returned annotation instances may be used to determine the exact location of the respective annotation instance.

      The following is a non-exhaustive list of examples of annotations returned by this method:

       @MyClassAnnotation
       public class Foo<@MyTypeAnnotation T> {
           @MyFieldAnnotation
           public String foo;
      
           public List<@MyTypeAnnotation String> bar;
      
           @MyMethodAnnotation
           public void foo() {...}
      
           public void foo(@MyParamAnnotation int param) {...}
      
           public void foo(List<@MyTypeAnnotation String> list) {...}
      
           public <@MyTypeAnnotation T> void foo(T t) {...}
       }
       
      Specified by:
      annotations in interface AnnotationTarget
      Parameters:
      name - name of the annotation type, must not be null
      Returns:
      immutable list of annotation instances, never null
      Since:
      3.0
      See Also:
    • annotationsWithRepeatable

      public final List<AnnotationInstance> annotationsWithRepeatable(DotName name, IndexView index)
      Returns the annotation instances with given name declared on this class, any of its members, or any type within the signature of the class or its members. The target() method of the returned annotation instances may be used to determine the exact location of the respective annotation instance.

      If the specified annotation is repeatable, the result also contains all values from the container annotation instance. In this case, the AnnotationInstance.target() returns the target of the container annotation instance.

      Specified by:
      annotationsWithRepeatable in interface AnnotationTarget
      Parameters:
      name - name of the annotation type, must not be null
      index - index used to obtain the annotation type, must not be null
      Returns:
      immutable list of annotation instances, never null
      Throws:
      IllegalArgumentException - if the index is null, if the index does not contain the annotation type or if name does not identify an annotation type
      Since:
      3.0
      See Also:
    • annotations

      public final List<AnnotationInstance> annotations()
      Returns the annotation instances declared on this class, any of its members, or any type within the signature of the class or its members. The target() method of the returned annotation instances may be used to determine the exact location of the respective annotation instance.

      The following is a non-exhaustive list of examples of annotations returned by this method:

       @MyClassAnnotation
       public class Foo<@MyTypeAnnotation T> {
           @MyFieldAnnotation
           public String foo;
      
           public List<@MyTypeAnnotation String> bar;
      
           @MyMethodAnnotation
           public void foo() {...}
      
           public void foo(@MyParamAnnotation int param) {...}
      
           public void foo(List<@MyTypeAnnotation String> list) {...}
      
           public <@MyTypeAnnotation T> void foo(T t) {...}
       }
       
      Specified by:
      annotations in interface AnnotationTarget
      Returns:
      immutable list of annotation instances, never null
      Since:
      3.0
    • hasDeclaredAnnotation

      public final boolean hasDeclaredAnnotation(DotName name)
      Returns whether an annotation instance with given name is declared on this class.

      Unlike hasAnnotation(DotName), this method ignores annotations declared on the class members and types within the signature of the class and its members.

      Specified by:
      hasDeclaredAnnotation in interface AnnotationTarget
      Parameters:
      name - name of the annotation type to look for, must not be null
      Returns:
      true if the annotation is present, false otherwise
      Since:
      3.0
      See Also:
    • declaredAnnotation

      public final AnnotationInstance declaredAnnotation(DotName name)
      Returns the annotation instance with given name declared on this class.

      Unlike annotation(DotName), this method doesn't return annotations declared on the class members and types within the signature of the class and its members.

      Specified by:
      declaredAnnotation in interface AnnotationTarget
      Parameters:
      name - name of the annotation type to look for, must not be null
      Returns:
      the annotation instance, or null if not found
      Since:
      3.0
      See Also:
    • declaredAnnotationsWithRepeatable

      public final List<AnnotationInstance> declaredAnnotationsWithRepeatable(DotName name, IndexView index)
      Returns the annotation instances with given name declared on this class.

      If the specified annotation is repeatable, the result also contains all values from the container annotation instance. In this case, the AnnotationInstance.target() returns the target of the container annotation instance.

      Unlike annotationsWithRepeatable(DotName, IndexView), this method doesn't return annotations declared on the class members and types within the signature of the class and its members.

      Specified by:
      declaredAnnotationsWithRepeatable in interface AnnotationTarget
      Parameters:
      name - name of the annotation type, must not be null
      index - index used to obtain the annotation type, must not be null
      Returns:
      immutable list of annotation instances, never null
      Throws:
      IllegalArgumentException - if the index is null, if the index does not contain the annotation type or if name does not identify an annotation type
      Since:
      3.0
      See Also:
    • declaredAnnotations

      public final List<AnnotationInstance> declaredAnnotations()
      Returns the annotation instances declared on this class.

      Unlike annotations(), this method doesn't return annotations the class members and types within the signature of the class and its members.

      Specified by:
      declaredAnnotations in interface AnnotationTarget
      Returns:
      immutable list of annotation instances, never null
      Since:
      3.0
      See Also:
    • annotationsMap

      public final Map<DotName,List<AnnotationInstance>> annotationsMap()
      Returns a map indexed by annotation name, with a value list of annotation instances. The annotation instances in this map correspond to both annotations on the class, and every nested element of the class (fields, types, methods, etc).

      The target of the annotation instance can be used to determine the location of the annotation usage.

      Returns:
      immutable map of annotations specified on this class and its elements, never null
    • annotations$$bridge

      public final Map<DotName,List<AnnotationInstance>> annotations$$bridge()
    • classAnnotations

      @Deprecated public final Collection<AnnotationInstance> classAnnotations()
      Deprecated.
      Returns a list of all annotations directly declared on this class.
      Returns:
      immutable list of annotations declared on this class
    • classAnnotation

      @Deprecated public final AnnotationInstance classAnnotation(DotName name)
      Returns the annotation with the specified name directly declared on this class.
      Parameters:
      name - the annotation name to look for
      Returns:
      the declared annotation or null if not found
    • classAnnotationsWithRepeatable

      @Deprecated public final List<AnnotationInstance> classAnnotationsWithRepeatable(DotName name, IndexView index)
      Retrieves annotation instances declared on this class, by the name of the annotation. If the specified annotation is repeatable (JLS 9.6), then attempt to result contains the values from the containing annotation.
      Parameters:
      name - the name of the annotation
      index - the index used to obtain the annotation class
      Returns:
      immutable list of annotation instances declared on this class, or an empty list if none
    • methods

      public final List<MethodInfo> methods()
      Returns a list of all methods declared in this class. This includes constructors and static initializer blocks which have the special names of <init> and <clinit>, respectively. It does not, however, include inherited methods. These must be discovered by traversing the class hierarchy.

      This list may be empty, but is never null.

      Returns:
      the list of methods declared in this class
    • unsortedMethods

      public final List<MethodInfo> unsortedMethods()
      Returns a list of all methods declared in this class, in the declaration order. See methods() for more information.

      Note that for the result to actually be in declaration order, the index must be produced by at least Jandex 2.4. Previous Jandex versions do not store method positions. At most 256 methods may be present; if there's more, order is undefined. This also assumes that the bytecode order corresponds to declaration order, which is not guaranteed, but practically always holds.

      Returns:
      a list of methods
      Since:
      2.4
    • constructors

      public final List<MethodInfo> constructors()
      Returns a list of all constructors declared in this class (which have the special name <init>). It does not include inherited constructors. These must be discovered by traversing the class hierarchy.

      This list may be empty, but is never null.

      Returns:
      the list of constructors declared in this class
    • method

      public final MethodInfo method(String name, Type... parameters)
      Retrieves a method based on its signature, which includes a method name and a parameter type list. The parameter type list is compared based on the underlying raw types. As an example, a generic type parameter T is considered equal to java.lang.Object, since the raw form of a type variable is its upper bound.

      Eligible methods include constructors and static initializer blocks which have the special names of <init> and <clinit>, respectively. This does not, however, include inherited methods. These must be discovered by traversing the class hierarchy.

      Parameters:
      name - the name of the method to find
      parameters - the type parameters of the method
      Returns:
      the located method or null if not found
    • firstMethod

      public final MethodInfo firstMethod(String name)
      Retrieves the "first" occurrence of a method by the given name. Note that the order of methods is not defined, and may change in the future. Therefore, this method should not be used when overloading is possible. It's merely intended to provide a handy shortcut for throw away or test code.
      Parameters:
      name - the name of the method
      Returns:
      the first discovered method matching this name, or null if no match is found
    • field

      public final FieldInfo field(String name)
      Retrieves a field by the given name. Only fields declared in this class are available. Locating inherited fields requires traversing the class hierarchy.
      Parameters:
      name - the name of the field
      Returns:
      the field
    • fields

      public final List<FieldInfo> fields()
      Returns a list of all available fields. Only fields declared in this class are available. Locating inherited fields requires traversing the class hierarchy. This list may be empty, but never null.
      Returns:
      a list of fields
    • unsortedFields

      public final List<FieldInfo> unsortedFields()
      Returns a list of all fields declared in this class, in the declaration order. See fields() for more information.

      Note that for the result to actually be in declaration order, the index must be produced by at least Jandex 2.4. Previous Jandex versions do not store field positions. At most 256 fields may be present; if there's more, order is undefined. This also assumes that the bytecode order corresponds to declaration order, which is not guaranteed, but practically always holds.

      Returns:
      a list of fields
      Since:
      2.4
    • recordComponent

      public final RecordComponentInfo recordComponent(String name)
      Retrieves a record component by the given name.
      Parameters:
      name - the name of the record component
      Returns:
      the record component
    • recordComponents

      public final List<RecordComponentInfo> recordComponents()
      Returns a list of all record components declared by this class. This list may be empty, but never null.
      Returns:
      a list of record components
    • unsortedRecordComponents

      public final List<RecordComponentInfo> unsortedRecordComponents()
      Returns a list of all record components declared in this class, in the declaration order. See recordComponents() for more information.

      Note that for the result to actually be in declaration order, the index must be produced by at least Jandex 2.4. Previous Jandex versions do not store record component positions. At most 256 record components may be present; if there's more, order is undefined. This also assumes that the bytecode order corresponds to declaration order, which is not guaranteed, but practically always holds.

      Returns:
      a list of record components
      Since:
      2.4
    • enumConstants

      public final List<FieldInfo> enumConstants()
      Returns a list of enum constants declared by this enum class, represented as FieldInfo. Enum constants are returned in declaration order.

      If this class is not an enum, returns an empty list.

      Note that for the result to actually be in declaration order, the index must be produced by at least Jandex 2.4. Previous Jandex versions do not store field positions. At most 256 fields may be present in the class; if there's more, order is undefined. This also assumes that the bytecode order corresponds to declaration order, which is not guaranteed, but practically always holds.

      Returns:
      immutable list of enum constants, never null
      Since:
      3.0.1
    • interfaceNames

      public final List<DotName> interfaceNames()
      Returns a list of names for all interfaces this class implements. This list may be empty, but never null.

      Note that this information is also available on the Type instances returned by interfaceTypes

      Returns:
      immutable list of names of interfaces implemented by this class
    • interfaceTypes

      public final List<Type> interfaceTypes()
      Returns the list of types in the implements clause of this class. These types may be generic types. This list may be empty, but is never null.
      Returns:
      immutable list of types declared in the implements clause of this class
    • superClassType

      public final Type superClassType()
      Returns a super type represented by the extends clause of this class. This type might be a generic type.
      Returns:
      the super class type definition in the extends clause
    • typeParameters

      public final List<TypeVariable> typeParameters()
      Returns the generic type parameters of this class, if any. These will be returned as resolved type variables, so if a parameter has a bound on another parameter, that information will be available.
      Returns:
      immutable list of generic type parameters of this class
    • hasNoArgsConstructor

      public final boolean hasNoArgsConstructor()
      Returns whether this class declares a zero-parameter constructor. This is determined from constructor descriptors, so mandated and synthetic parameters are also taken into account. In other words, for Java classes (other JVM languages may differ), this method never returns true for inner classes (that is, non-static member classes, local classes and anonymous classes). In such case, a constructor may exist among methods() that has no MethodInfo.parameters(), but MethodInfo.descriptorParameterTypes() would reveal that some implicitly declared (aka mandated) or synthetic parameters exist.

      This information is available in indexes produced by Jandex 1.2.0 and later.

      Returns:
      true if this class has a zero-parameter constructor, false if it does not
      Since:
      1.2.0
    • nestingType

      public ClassInfo.NestingType nestingType()
      Returns the nesting type of this class, which could either be a standard top level class, a member class (NestingType.INNER), an anonymous class, or a local class.

      For historical reasons, static member classes are also returned as INNER. You can differentiate between a non-static member class (inner class) and a static member class by calling Modifier.isStatic(int) on the return value of flags().

      Returns:
      the nesting type of this class
    • simpleName

      public String simpleName()
      Returns the source declared name of this class if it is a top-level class, member class or a local class. Otherwise returns null.
      Returns:
      the simple name of a top-level, member or local class, or null if this is an anonymous class
    • enclosingClass

      public DotName enclosingClass()
      Returns the enclosing class if this is a member class, or null if this is a top-level, local or anonymous class.
      Returns:
      the enclosing class if this class is a member class
    • enclosingMethod

      public ClassInfo.EnclosingMethodInfo enclosingMethod()
      Returns the enclosing method of this class if it is a local or anonymous class declared within the body of a method or constructor. Returns null if this class is a top level or a member class or if the local or anonymous class is declared within a class or instance initializer.
      Returns:
      the enclosing method/constructor, if this class is a local or anonymous class declared within a method or constructor, otherwise null
    • memberClasses

      public Set<DotName> memberClasses()
      Returns a set of names of member classes declared in this class. Member classes are classes directly enclosed in another class. That is, local classes and anonymous classes are not member classes.

      Member classes of member classes are not included in the returned set.

      Never returns null, but may return an empty set.

      Returns:
      immutable set of names of this class's member classes, never null
    • module

      public ModuleInfo module()
      Returns the module information from this class if it is a module descriptor, i.e. module-info.
      Returns:
      the module descriptor for module classes, otherwise null
    • requiresGenericSignature

      public boolean requiresGenericSignature()
      Returns whether this class must have a generic signature. That is, whether the Java compiler when compiling this class had to emit the Signature bytecode attribute.
      Specified by:
      requiresGenericSignature in interface GenericSignature
      Returns:
      whether this class must have a generic signature
    • genericSignature

      public String genericSignature(Function<String,Type> typeVariableSubstitution)
      Returns a generic signature of this class, possibly without any generic-related information. That is, produces a correct generic signature even if this class is not generic and does not use any type variables.

      Signatures of type variables are substituted for signatures of types provided by the substitution function typeVariableSubstitution. If the substitution function returns null for some type variable identifier, no substitution happens and the type variable signature is used unmodified.

      Note that the return value does not come directly from bytecode. Jandex does not store the signature strings. Instead, the return value is reconstructed from the Jandex object model.

      Specified by:
      genericSignature in interface GenericSignature
      Parameters:
      typeVariableSubstitution - a substitution function from type variable identifiers to types
      Returns:
      a generic signature of this class with type variables substituted, never null
    • descriptor

      public String descriptor(Function<String,Type> typeVariableSubstitution)
      Returns a bytecode descriptor of the type introduced by this class.

      Note that the return value does not come directly from bytecode. Jandex does not store the descriptor strings. Instead, the return value is reconstructed from the Jandex object model.

      Specified by:
      descriptor in interface Descriptor
      Parameters:
      typeVariableSubstitution - a substitution function from type variable identifiers to types
      Returns:
      the bytecode descriptor of this class's type
    • asClass

      public ClassInfo asClass()
      Description copied from interface: AnnotationTarget
      Casts and returns this target as a ClassInfo if it is of kind CLASS
      Specified by:
      asClass in interface AnnotationTarget
      Returns:
      this instance cast to a class
    • asField

      public FieldInfo asField()
      Description copied from interface: AnnotationTarget
      Casts and returns this target as a FieldInfo if it is of kind FIELD
      Specified by:
      asField in interface AnnotationTarget
      Returns:
      this instance cast to a field
    • asMethod

      public MethodInfo asMethod()
      Description copied from interface: AnnotationTarget
      Casts and returns this target as a MethodInfo if it is of kind METHOD
      Specified by:
      asMethod in interface AnnotationTarget
      Returns:
      this instance cast to a method
    • asMethodParameter

      public MethodParameterInfo asMethodParameter()
      Description copied from interface: AnnotationTarget
      Casts and returns this target as a MethodParameterInfo if it is of kind METHOD_PARAMETER
      Specified by:
      asMethodParameter in interface AnnotationTarget
      Returns:
      this instance cast to a method parameter
    • asType

      public TypeTarget asType()
      Description copied from interface: AnnotationTarget
      Casts and returns this target as a TypeTarget if it is of kind TYPE
      Specified by:
      asType in interface AnnotationTarget
      Returns:
      this instance cast to a type target
    • asRecordComponent

      public RecordComponentInfo asRecordComponent()
      Description copied from interface: AnnotationTarget
      Casts and returns this target as a RecordComponentInfo if it is of kind RECORD_COMPONENT
      Specified by:
      asRecordComponent in interface AnnotationTarget
      Returns:
      this instance cast to a record component