ConstructorUtils (Apache Commons Lang 3.17.0 API)
Description: declaration: package: org.apache.commons.lang3.reflect, class: ConstructorUtils

Package org.apache.commons.lang3.reflect

# Class ConstructorUtils

java.lang.Object
org.apache.commons.lang3.reflect.ConstructorUtils

public class ConstructorUtils extends Object
Utility reflection methods focused on constructors, modeled after `MethodUtils`.

## Known Limitations

### Accessing Public Constructors In A Default Access Superclass

There is an issue when invoking `public` constructors contained in a default access superclass. Reflection correctly locates these constructors and assigns them as `public`. However, an `IllegalAccessException` is thrown if the constructor is invoked.

`ConstructorUtils` contains a workaround for this situation: it will attempt to call `AccessibleObject.setAccessible(boolean)` on this constructor. If this call succeeds, then the method can be invoked as normal. This call will only succeed when the application has sufficient security privileges. If this call fails then a warning will be logged and the method may fail.

Since:
  2.5

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `ConstructorUtils()`
  Deprecated.
  TODO Make private in 4.0.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static <T> Constructor<T>`
  `getAccessibleConstructor(Class<T> cls, Class<?>... parameterTypes)`
  Finds a constructor given a class and signature, checking accessibility.
  `static <T> Constructor<T>`
  `getAccessibleConstructor(Constructor<T> ctor)`
  Checks if the specified constructor is accessible.
  `static <T> Constructor<T>`
  `getMatchingAccessibleConstructor(Class<T> cls, Class<?>... parameterTypes)`
  Finds an accessible constructor with compatible parameters.
  `static <T> T`
  `invokeConstructor(Class<T> cls, Object... args)`
  Returns a new instance of the specified class inferring the right constructor from the types of the arguments.
  `static <T> T`
  `invokeConstructor(Class<T> cls, Object[] args, Class<?>[] parameterTypes)`
  Returns a new instance of the specified class choosing the right constructor from the list of parameter types.
  `static <T> T`
  `invokeExactConstructor(Class<T> cls, Object... args)`
  Returns a new instance of the specified class inferring the right constructor from the types of the arguments.
  `static <T> T`
  `invokeExactConstructor(Class<T> cls, Object[] args, Class<?>[] parameterTypes)`
  Returns a new instance of the specified class choosing the right constructor from the list of parameter types.

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Constructor Details

  - ### ConstructorUtils

    @Deprecated public ConstructorUtils()
    Deprecated.
    TODO Make private in 4.0.
    ConstructorUtils instances should NOT be constructed in standard programming. Instead, the class should be used as `ConstructorUtils.invokeConstructor(cls, args)`.

    This constructor is `public` to permit tools that require a JavaBean instance to operate.

- ## Method Details

  - ### getAccessibleConstructor

    public static <T> Constructor<T> getAccessibleConstructor(Class<T> cls, Class<?>... parameterTypes)
    Finds a constructor given a class and signature, checking accessibility.

    This finds the constructor and ensures that it is accessible. The constructor signature must match the parameter types exactly.

    Type Parameters:
      `T` - the constructor type
    Parameters:
      `cls` - the class to find a constructor for, not `null`
      `parameterTypes` - the array of parameter types, `null` treated as empty
    Returns:
      the constructor, `null` if no matching accessible constructor found
    Throws:
      `NullPointerException` - if `cls` is `null`
    See Also:
      - `Class.getConstructor(java.lang.Class<?>...)`
      - `getAccessibleConstructor(java.lang.reflect.Constructor)`

  - ### getAccessibleConstructor

    public static <T> Constructor<T> getAccessibleConstructor(Constructor<T> ctor)
    Checks if the specified constructor is accessible.

    This simply ensures that the constructor is accessible.

    Type Parameters:
      `T` - the constructor type
    Parameters:
      `ctor` - the prototype constructor object, not `null`
    Returns:
      the constructor, `null` if no matching accessible constructor found
    Throws:
      `NullPointerException` - if `ctor` is `null`
    See Also:
      - `SecurityManager`

  - ### getMatchingAccessibleConstructor

    public static <T> Constructor<T> getMatchingAccessibleConstructor(Class<T> cls, Class<?>... parameterTypes)
    Finds an accessible constructor with compatible parameters.

    This checks all the constructor and finds one with compatible parameters This requires that every parameter is assignable from the given parameter types. This is a more flexible search than the normal exact matching algorithm.

    First it checks if there is a constructor matching the exact signature. If not then all the constructors of the class are checked to see if their signatures are assignment-compatible with the parameter types. The first assignment-compatible matching constructor is returned.

    Type Parameters:
      `T` - the constructor type
    Parameters:
      `cls` - the class to find a constructor for, not `null`
      `parameterTypes` - find method with compatible parameters
    Returns:
      the constructor, null if no matching accessible constructor found
    Throws:
      `NullPointerException` - if `cls` is `null`

  - ### invokeConstructor

    public static <T> T invokeConstructor(Class<T> cls, Object... args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
    Returns a new instance of the specified class inferring the right constructor from the types of the arguments.

    This locates and calls a constructor. The constructor signature must match the argument types by assignment compatibility.

    Type Parameters:
      `T` - the type to be constructed
    Parameters:
      `cls` - the class to be constructed, not `null`
      `args` - the array of arguments, `null` treated as empty
    Returns:
      new instance of `cls`, not `null`
    Throws:
      `NullPointerException` - if `cls` is `null`
      `NoSuchMethodException` - if a matching constructor cannot be found
      `IllegalAccessException` - if invocation is not permitted by security
      `InvocationTargetException` - if an error occurs on invocation
      `InstantiationException` - if an error occurs on instantiation
    See Also:
      - `invokeConstructor(Class, Object[], Class[])`

  - ### invokeConstructor

    public static <T> T invokeConstructor(Class<T> cls, Object[] args, Class<?>[] parameterTypes) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
    Returns a new instance of the specified class choosing the right constructor from the list of parameter types.

    This locates and calls a constructor. The constructor signature must match the parameter types by assignment compatibility.

    Type Parameters:
      `T` - the type to be constructed
    Parameters:
      `cls` - the class to be constructed, not `null`
      `args` - the array of arguments, `null` treated as empty
      `parameterTypes` - the array of parameter types, `null` treated as empty
    Returns:
      new instance of `cls`, not `null`
    Throws:
      `NullPointerException` - if `cls` is `null`
      `NoSuchMethodException` - if a matching constructor cannot be found
      `IllegalAccessException` - if invocation is not permitted by security
      `InvocationTargetException` - if an error occurs on invocation
      `InstantiationException` - if an error occurs on instantiation
    See Also:
      - `Constructor.newInstance(java.lang.Object...)`

  - ### invokeExactConstructor

    public static <T> T invokeExactConstructor(Class<T> cls, Object... args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
    Returns a new instance of the specified class inferring the right constructor from the types of the arguments.

    This locates and calls a constructor. The constructor signature must match the argument types exactly.

    Type Parameters:
      `T` - the type to be constructed
    Parameters:
      `cls` - the class to be constructed, not `null`
      `args` - the array of arguments, `null` treated as empty
    Returns:
      new instance of `cls`, not `null`
    Throws:
      `NullPointerException` - if `cls` is `null`
      `NoSuchMethodException` - if a matching constructor cannot be found
      `IllegalAccessException` - if invocation is not permitted by security
      `InvocationTargetException` - if an error occurs on invocation
      `InstantiationException` - if an error occurs on instantiation
    See Also:
      - `invokeExactConstructor(Class, Object[], Class[])`

  - ### invokeExactConstructor

    public static <T> T invokeExactConstructor(Class<T> cls, Object[] args, Class<?>[] parameterTypes) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
    Returns a new instance of the specified class choosing the right constructor from the list of parameter types.

    This locates and calls a constructor. The constructor signature must match the parameter types exactly.

    Type Parameters:
      `T` - the type to be constructed
    Parameters:
      `cls` - the class to be constructed, not `null`
      `args` - the array of arguments, `null` treated as empty
      `parameterTypes` - the array of parameter types, `null` treated as empty
    Returns:
      new instance of `cls`, not `null`
    Throws:
      `NullPointerException` - if `cls` is `null`
      `NoSuchMethodException` - if a matching constructor cannot be found
      `IllegalAccessException` - if invocation is not permitted by security
      `InvocationTargetException` - if an error occurs on invocation
      `InstantiationException` - if an error occurs on instantiation
    See Also:
      - `Constructor.newInstance(java.lang.Object...)`