# Interface ClassDesc

All Superinterfaces:
  `ConstantDesc, TypeDescriptor, TypeDescriptor.OfField<ClassDesc>`

public sealed interface ClassDesc extends ConstantDesc, TypeDescriptor.OfField<ClassDesc>
A nominal descriptor for a `Class` constant.

For common system types, including all the primitive types, there are predefined ClassDesc constants in `ConstantDescs`. (The `java.lang.constant` APIs consider `void` to be a primitive type.) To create a ClassDesc for a class or interface type, use `of(String)` or `ofDescriptor(String)`; to create a ClassDesc for an array type, use `ofDescriptor(String)`, or first obtain a ClassDesc for the component type and then call the `arrayType()` or `arrayType(int)` methods.

Since:
  12
See Also:
  - `ConstantDescs`

## Nested Class Summary

### Nested classes/interfaces declared in interface TypeDescriptor

`TypeDescriptor.OfField<F>, TypeDescriptor.OfMethod<F,M>`

## Method Summary

Modifier and Type
Method
Description
`ClassDesc`
`arrayType()`
Returns a ClassDesc for an array type whose component type is described by this ClassDesc.
`ClassDesc`
`arrayType(int rank)`
Returns a ClassDesc for an array type of the specified rank, whose component type is described by this ClassDesc.
`default ClassDesc`
`componentType()`
Returns the component type of this ClassDesc, if it describes an array type, or `null` otherwise.
`String`
`descriptorString()`
Returns a field type descriptor string for this type
`String`
`displayName()`
Returns a human-readable name for this `ClassDesc`.
`boolean`
`equals(Object o)`
Compare the specified object with this descriptor for equality.
`default boolean`
`isArray()`
Returns whether this ClassDesc describes an array type.
`default boolean`
`isClassOrInterface()`
Returns whether this ClassDesc describes a class or interface type.
`default boolean`
`isPrimitive()`
Returns whether this ClassDesc describes a primitive type.
`default ClassDesc`
`nested(String nestedName)`
Returns a ClassDesc for a nested class of the class or interface type described by this ClassDesc.
`default ClassDesc`
`nested(String firstNestedName, String... moreNestedNames)`
Returns a ClassDesc for a nested class of the class or interface type described by this ClassDesc.
`static ClassDesc`
`of(String name)`
Returns a ClassDesc for a class or interface type, given the name of the class or interface, such as `"java.lang.String"`.
`static ClassDesc`
`of(String packageName, String className)`
Returns a ClassDesc for a class or interface type, given a package name and the unqualified (simple) name for the class or interface.
`static ClassDesc`
`ofDescriptor(String descriptor)`
Returns a ClassDesc given a descriptor string for a class, interface, array, or primitive type.
`static ClassDesc`
`ofInternalName(String name)`
Returns a ClassDesc for a class or interface type, given the name of the class or interface in internal form, such as `"java/lang/String"`.
`default String`
`packageName()`
Returns the package name of this ClassDesc, if it describes a class or interface type.
`Class<?>`
`resolveConstantDesc(MethodHandles.Lookup lookup)`
Resolves this descriptor reflectively, emulating the resolution behavior of JVMS 5.4.3 and the access control behavior of JVMS 5.4.4.

## Method Details

### of

static ClassDesc of(String name)
Returns a ClassDesc for a class or interface type, given the name of the class or interface, such as `"java.lang.String"`. (To create a descriptor for an array type, either use `ofDescriptor(String)` or `arrayType()`; to create a descriptor for a primitive type, use `ofDescriptor(String)` or use the predefined constants in `ConstantDescs`).

Parameters:
  `name` - the fully qualified (dot-separated) binary class name
Returns:
  a ClassDesc describing the desired class
Throws:
  `NullPointerException` - if the argument is `null`
  `IllegalArgumentException` - if the name string is not in the correct format
See Also:
  - `ofDescriptor(String)`
  - `ofInternalName(String)`

### ofInternalName

static ClassDesc ofInternalName(String name)
Returns a ClassDesc for a class or interface type, given the name of the class or interface in internal form, such as `"java/lang/String"`.

API Note:
  To create a descriptor for an array type, either use `ofDescriptor(String)` or `arrayType()`; to create a descriptor for a primitive type, use `ofDescriptor(String)` or use the predefined constants in `ConstantDescs`.
Parameters:
  `name` - the fully qualified class name, in internal (slash-separated) form
Returns:
  a ClassDesc describing the desired class
Throws:
  `NullPointerException` - if the argument is `null`
  `IllegalArgumentException` - if the name string is not in the correct format
See Java Virtual Machine Specification:
  4.2.1 Binary Class and Interface Names
Since:
  20
See Also:
  - `of(String)`
  - `ofDescriptor(String)`

### of

static ClassDesc of(String packageName, String className)
Returns a ClassDesc for a class or interface type, given a package name and the unqualified (simple) name for the class or interface.

Parameters:
  `packageName` - the package name (dot-separated); if the package name is the empty string, the class is considered to be in the unnamed package
  `className` - the unqualified (simple) class name
Returns:
  a ClassDesc describing the desired class
Throws:
  `NullPointerException` - if any argument is `null`
  `IllegalArgumentException` - if the package name or class name are not in the correct format

### ofDescriptor

static ClassDesc ofDescriptor(String descriptor)
Returns a ClassDesc given a descriptor string for a class, interface, array, or primitive type.

API Note:
  A field type descriptor string for a non-array type is either a one-letter code corresponding to a primitive type (`"J", "I", "C", "S", "B", "D", "F", "Z", "V"`), or the letter `"L"`, followed by the fully qualified binary name of a class, followed by `";"`. A field type descriptor for an array type is the character `"["` followed by the field descriptor for the component type. Examples of valid type descriptor strings include `"Ljava/lang/String;"`, `"I"`, `"[I"`, `"V"`, `"[Ljava/lang/String;"`, etc. See JVMS 4.3.2 ("Field Descriptors") for more detail.
Parameters:
  `descriptor` - a field descriptor string
Returns:
  a ClassDesc describing the desired class
Throws:
  `NullPointerException` - if the argument is `null`
  `IllegalArgumentException` - if the descriptor string is not in the correct format
See Java Virtual Machine Specification:
  4.3.2 Field Descriptors
  4.4.1 The CONSTANT_Class_info Structure
See Also:
  - `of(String)`
  - `ofInternalName(String)`

### arrayType

ClassDesc arrayType()
Returns a ClassDesc for an array type whose component type is described by this ClassDesc.

Specified by:
  `arrayType` in interface `TypeDescriptor.OfField<ClassDesc>`
Returns:
  a ClassDesc describing the array type
Throws:
  `IllegalStateException` - if the resulting ClassDesc would have an array rank of greater than 255
See Java Virtual Machine Specification:
  4.4.1 The CONSTANT_Class_info Structure

### arrayType

ClassDesc arrayType(int rank)
Returns a ClassDesc for an array type of the specified rank, whose component type is described by this ClassDesc.

Parameters:
  `rank` - the rank of the array
Returns:
  a ClassDesc describing the array type
Throws:
  `IllegalArgumentException` - if the rank is less than or equal to zero or if the rank of the resulting array type is greater than 255
See Java Virtual Machine Specification:
  4.4.1 The CONSTANT_Class_info Structure

### nested

default ClassDesc nested(String nestedName)
Returns a ClassDesc for a nested class of the class or interface type described by this ClassDesc.

API Note:
  Example: If descriptor `d` describes the class `java.util.Map`, a descriptor for the class `java.util.Map.Entry` could be obtained by `d.nested("Entry")`.
Parameters:
  `nestedName` - the unqualified name of the nested class
Returns:
  a ClassDesc describing the nested class
Throws:
  `NullPointerException` - if the argument is `null`
  `IllegalStateException` - if this ClassDesc does not describe a class or interface type
  `IllegalArgumentException` - if the nested class name is invalid

### nested

default ClassDesc nested(String firstNestedName, String... moreNestedNames)
Returns a ClassDesc for a nested class of the class or interface type described by this ClassDesc.

Parameters:
  `firstNestedName` - the unqualified name of the first level of nested class
  `moreNestedNames` - the unqualified name(s) of the remaining levels of nested class
Returns:
  a ClassDesc describing the nested class
Throws:
  `NullPointerException` - if any argument or its contents is `null`
  `IllegalStateException` - if this ClassDesc does not describe a class or interface type
  `IllegalArgumentException` - if the nested class name is invalid

### isArray

default boolean isArray()
Returns whether this ClassDesc describes an array type.

Specified by:
  `isArray` in interface `TypeDescriptor.OfField<ClassDesc>`
Returns:
  whether this ClassDesc describes an array type

### isPrimitive

default boolean isPrimitive()
Returns whether this ClassDesc describes a primitive type.

Specified by:
  `isPrimitive` in interface `TypeDescriptor.OfField<ClassDesc>`
Returns:
  whether this ClassDesc describes a primitive type

### isClassOrInterface

default boolean isClassOrInterface()
Returns whether this ClassDesc describes a class or interface type.

Returns:
  whether this ClassDesc describes a class or interface type

### componentType

default ClassDesc componentType()
Returns the component type of this ClassDesc, if it describes an array type, or `null` otherwise.

Specified by:
  `componentType` in interface `TypeDescriptor.OfField<ClassDesc>`
Returns:
  a ClassDesc describing the component type, or `null` if this descriptor does not describe an array type

### packageName

default String packageName()
Returns the package name of this ClassDesc, if it describes a class or interface type.

Returns:
  the package name, or the empty string if the class is in the default package, or this ClassDesc does not describe a class or interface type

### displayName

String displayName()
Returns a human-readable name for this `ClassDesc`. For primitive types, this method returns the simple name (such as `int`). For class or interface types, this method returns the unqualified class name. For array types, this method returns the human-readable name of the component type suffixed with the appropriate number of `[]` pairs.

Returns:
  a human-readable name for this `ClassDesc`

### descriptorString

String descriptorString()
Returns a field type descriptor string for this type

Specified by:
  `descriptorString` in interface `TypeDescriptor`
Returns:
  the descriptor string
See Java Virtual Machine Specification:
  4.3.2 Field Descriptors

### resolveConstantDesc

Class<?> resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException
Description copied from interface: `ConstantDesc`
Resolves this descriptor reflectively, emulating the resolution behavior of JVMS 5.4.3 and the access control behavior of JVMS 5.4.4. The resolution and access control context is provided by the `MethodHandles.Lookup` parameter. No caching of the resulting value is performed.

Specified by:
  `resolveConstantDesc` in interface `ConstantDesc`
Parameters:
  `lookup` - The `MethodHandles.Lookup` to provide name resolution and access control context
Returns:
  the resolved constant value
Throws:
  `ReflectiveOperationException` - if a class, method, or field could not be reflectively resolved in the course of resolution
Since:
  21

### equals

boolean equals(Object o)
Compare the specified object with this descriptor for equality. Returns `true` if and only if the specified object is also a ClassDesc and both describe the same type.

Overrides:
  `equals` in class `Object`
Parameters:
  `o` - the other object
Returns:
  whether this descriptor is equal to the other object
See Also:
  - `Object.hashCode()`
  - `HashMap`