Package org.apache.commons.beanutils2

# Class PropertyUtilsBean

java.lang.Object
org.apache.commons.beanutils2.PropertyUtilsBean

public class PropertyUtilsBean extends Object
Utility methods for using Java Reflection APIs to facilitate generic property getter and setter operations on Java objects. Much of this code was originally included in `BeanUtils`, but has been separated because of the volume of code involved.

In general, the objects that are examined and modified using these methods are expected to conform to the property getter and setter method naming conventions described in the JavaBeans Specification (Version 1.0.1). No data type conversions are performed, and there are no usage of any `PropertyEditor` classes that have been registered, although a convenient way to access the registered classes themselves is included.

For the purposes of this class, five formats for referencing a particular property value of a bean are defined, with the default layout of an identifying String in parentheses. However the notation for these formats and how they are resolved is now (since BeanUtils 1.8.0) controlled by the configured `Resolver` implementation:

- Simple (`name`) - The specified `name` identifies an individual property of a particular JavaBean. The name of the actual getter or setter method to be used is determined using standard JavaBeans introspection, so that (unless overridden by a `BeanInfo` class, a property named "xyz" will have a getter method named `getXyz()` or (for boolean properties only) `isXyz()`, and a setter method named `setXyz()`.
- Nested (`name1.name2.name3`) The first name element is used to select a property getter, as for simple references above. The object returned for this property is then consulted, using the same approach, for a property getter for a property named `name2`, and so on. The property value that is ultimately retrieved or modified is the one identified by the last name element.
- Indexed (`name[index]`) - The underlying property value is assumed to be an array, or this JavaBean is assumed to have indexed property getter and setter methods. The appropriate (zero-relative) entry in the array is selected. `List` objects are now also supported for read/write. You simply need to define a getter that returns the `List`
- Mapped (`name(key)`) - The JavaBean is assumed to have an property getter and setter methods with an additional attribute of type `String`.
- Combined (`name1.name2[index].name3(key)`) - Combining mapped, nested, and indexed references is also supported.

Since:
  1.7
See Also:
  - `Resolver`
  - `PropertyUtils`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `PropertyUtilsBean()`
  Base constructor

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addBeanIntrospector(BeanIntrospector introspector)`
  Adds a `BeanIntrospector`.
  `void`
  `clearDescriptors()`
  Clear any cached property descriptors information for all classes loaded by any class loaders.
  `void`
  `copyProperties(Object dest, Object orig)`
  Copy property values from the "origin" bean to the "destination" bean for all cases where the property names are the same (even though the actual getter and setter methods might have been customized via `BeanInfo` classes).
  `Map<String,Object>`
  `describe(Object bean)`
  Return the entire set of properties for which the specified bean provides a read method.
  `Object`
  `getIndexedProperty(Object bean, String name)`
  Gets the value of the specified indexed property of the specified bean, with no type conversions.
  `Object`
  `getIndexedProperty(Object bean, String name, int index)`
  Gets the value of the specified indexed property of the specified bean, with no type conversions.
  `protected static PropertyUtilsBean`
  `getInstance()`
  Gets the PropertyUtils bean instance.
  `Object`
  `getMappedProperty(Object bean, String name)`
  Gets the value of the specified mapped property of the specified bean, with no type conversions.
  `Object`
  `getMappedProperty(Object bean, String name, String key)`
  Gets the value of the specified mapped property of the specified bean, with no type conversions.
  `Object`
  `getNestedProperty(Object bean, String name)`
  Gets the value of the (possibly nested) property of the specified name, for the specified bean, with no type conversions.
  `Object`
  `getProperty(Object bean, String name)`
  Gets the value of the specified property of the specified bean, no matter which property reference format is used, with no type conversions.
  `PropertyDescriptor`
  `getPropertyDescriptor(Object bean, String name)`
  Retrieve the property descriptor for the specified property of the specified bean, or return `null` if there is no such descriptor.
  `PropertyDescriptor[]`
  `getPropertyDescriptors(Class<?> beanClass)`
  Retrieve the property descriptors for the specified class, introspecting and caching them the first time a particular bean class is encountered.
  `PropertyDescriptor[]`
  `getPropertyDescriptors(Object bean)`
  Retrieve the property descriptors for the specified bean, introspecting and caching them the first time a particular bean class is encountered.
  `Class<?>`
  `getPropertyEditorClass(Object bean, String name)`
  Return the Java Class repesenting the property editor class that has been registered for this property (if any).
  `protected Object`
  `getPropertyOfMapBean(Map<?,?> bean, String propertyName)`
  This method is called by getNestedProperty and setNestedProperty to define what it means to get a property from an object which implements Map.
  `Class<?>`
  `getPropertyType(Object bean, String name)`
  Gets the Java Class representing the property type of the specified property, or `null` if there is no such property for the specified bean.
  `Method`
  `getReadMethod(PropertyDescriptor descriptor)`
  Return an accessible property getter method for this property, if there is one; otherwise return `null`.
  `Method`
  `getReadMethod(Class<?> clazz, PropertyDescriptor descriptor)`
  Return the property getter method for this property if accessible from given `clazz` (and if there is one at all); otherwise return `null`.
  `Resolver`
  `getResolver()`
  Gets the configured `Resolver` implementation used by BeanUtils.
  `Object`
  `getSimpleProperty(Object bean, String name)`
  Gets the value of the specified simple property of the specified bean, with no type conversions.
  `Method`
  `getWriteMethod(PropertyDescriptor descriptor)`
  Return an accessible property setter method for this property, if there is one; otherwise return `null`.
  `Method`
  `getWriteMethod(Class<?> clazz, PropertyDescriptor descriptor)`
  Return the property setter method for this property if accessible from given `clazz` (and if there is one at all); otherwise return `null`.
  `boolean`
  `isReadable(Object bean, String name)`
  Return `true` if the specified property name identifies a readable property on the specified bean; otherwise, return `false`.
  `boolean`
  `isWriteable(Object bean, String name)`
  Return `true` if the specified property name identifies a writable property on the specified bean; otherwise, return `false`.
  `boolean`
  `removeBeanIntrospector(BeanIntrospector introspector)`
  Removes the specified `BeanIntrospector`.
  `final void`
  `resetBeanIntrospectors()`
  Resets the `BeanIntrospector` objects registered at this instance.
  `void`
  `setIndexedProperty(Object bean, String name, int index, Object value)`
  Sets the value of the specified indexed property of the specified bean, with no type conversions.
  `void`
  `setIndexedProperty(Object bean, String name, Object value)`
  Sets the value of the specified indexed property of the specified bean, with no type conversions.
  `void`
  `setMappedProperty(Object bean, String name, Object value)`
  Sets the value of the specified mapped property of the specified bean, with no type conversions.
  `void`
  `setMappedProperty(Object bean, String name, String key, Object value)`
  Sets the value of the specified mapped property of the specified bean, with no type conversions.
  `void`
  `setNestedProperty(Object bean, String name, Object value)`
  Sets the value of the (possibly nested) property of the specified name, for the specified bean, with no type conversions.
  `void`
  `setProperty(Object bean, String name, Object value)`
  Sets the value of the specified property of the specified bean, no matter which property reference format is used, with no type conversions.
  `protected void`
  `setPropertyOfMapBean(Map<String,Object> bean, String propertyName, Object value)`
  This method is called by method setNestedProperty when the current bean is found to be a Map object, and defines how to deal with setting a property on a Map.
  `void`
  `setResolver(Resolver resolver)`
  Configure the `Resolver` implementation used by BeanUtils.
  `void`
  `setSimpleProperty(Object bean, String name, Object value)`
  Sets the value of the specified simple property of the specified bean, with no type conversions.

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

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

- ## Constructor Details

  - ### PropertyUtilsBean

    public PropertyUtilsBean()
    Base constructor

- ## Method Details

  - ### getInstance

    protected static PropertyUtilsBean getInstance()
    Gets the PropertyUtils bean instance.
    Returns:
      The PropertyUtils bean instance

  - ### addBeanIntrospector

    public void addBeanIntrospector(BeanIntrospector introspector)
    Adds a `BeanIntrospector`. This object is invoked when the property descriptors of a class need to be obtained.
    Parameters:
      `introspector` - the `BeanIntrospector` to be added (must not be null
    Throws:
      `IllegalArgumentException` - if the argument is null
    Since:
      1.9

  - ### clearDescriptors

    public void clearDescriptors()
    Clear any cached property descriptors information for all classes loaded by any class loaders. This is useful in cases where class loaders are thrown away to implement class reloading.

  - ### copyProperties

    public void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException

    Copy property values from the "origin" bean to the "destination" bean for all cases where the property names are the same (even though the actual getter and setter methods might have been customized via `BeanInfo` classes). No conversions are performed on the actual property values -- it is assumed that the values retrieved from the origin bean are assignment-compatible with the types expected by the destination bean.

    If the origin "bean" is actually a `Map`, it is assumed to contain String-valued simple property names as the keys, pointing at the corresponding property values that will be set in the destination bean.Note that this method is intended to perform a "shallow copy" of the properties and so complex properties (for example, nested ones) will not be copied.

    Note, that this method will not copy a List to a List, or an Object[] to an Object[]. It's specifically for copying JavaBean properties.

    Parameters:
      `dest` - Destination bean whose properties are modified
      `orig` - Origin bean whose properties are retrieved
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if the `dest` or `orig` argument is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### describe

    public Map<String,Object> describe(Object bean) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException

    Return the entire set of properties for which the specified bean provides a read method. This map contains the unconverted property values for all properties for which a read method is provided (i.e. where the `getReadMethod()` returns non-null).

    FIXME - Does not account for mapped properties.

    Parameters:
      `bean` - Bean whose properties are to be extracted
    Returns:
      The set of properties for the bean
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getIndexedProperty

    public Object getIndexedProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the value of the specified indexed property of the specified bean, with no type conversions. The zero-relative index of the required value must be included (in square brackets) as a suffix to the property name, or `IllegalArgumentException` will be thrown. In addition to supporting the JavaBeans specification, this method has been extended to support `List` objects as well.
    Parameters:
      `bean` - Bean whose property is to be extracted
      `name` - `propertyname[index]` of the property value to be extracted
    Returns:
      the indexed property value
    Throws:
      `IndexOutOfBoundsException` - if the specified index is outside the valid range for the underlying array or List
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getIndexedProperty

    public Object getIndexedProperty(Object bean, String name, int index) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the value of the specified indexed property of the specified bean, with no type conversions. In addition to supporting the JavaBeans specification, this method has been extended to support `List` objects as well.
    Parameters:
      `bean` - Bean whose property is to be extracted
      `name` - Simple property name of the property value to be extracted
      `index` - Index of the property value to be extracted
    Returns:
      the indexed property value
    Throws:
      `IndexOutOfBoundsException` - if the specified index is outside the valid range for the underlying property
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getMappedProperty

    public Object getMappedProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the value of the specified mapped property of the specified bean, with no type conversions. The key of the required value must be included (in brackets) as a suffix to the property name, or `IllegalArgumentException` will be thrown.
    Parameters:
      `bean` - Bean whose property is to be extracted
      `name` - `propertyname(key)` of the property value to be extracted
    Returns:
      the mapped property value
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getMappedProperty

    public Object getMappedProperty(Object bean, String name, String key) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the value of the specified mapped property of the specified bean, with no type conversions.
    Parameters:
      `bean` - Bean whose property is to be extracted
      `name` - Mapped property name of the property value to be extracted
      `key` - Key of the property value to be extracted
    Returns:
      the mapped property value
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getNestedProperty

    public Object getNestedProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the value of the (possibly nested) property of the specified name, for the specified bean, with no type conversions.
    Parameters:
      `bean` - Bean whose property is to be extracted
      `name` - Possibly nested name of the property to be extracted
    Returns:
      the nested property value
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `NestedNullException` - if a nested reference to a property returns null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getProperty

    public Object getProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the value of the specified property of the specified bean, no matter which property reference format is used, with no type conversions.
    Parameters:
      `bean` - Bean whose property is to be extracted
      `name` - Possibly indexed and/or nested name of the property to be extracted
    Returns:
      the property value
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getPropertyDescriptor

    public PropertyDescriptor getPropertyDescriptor(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException

    Retrieve the property descriptor for the specified property of the specified bean, or return `null` if there is no such descriptor. This method resolves indexed and nested property references in the same manner as other methods in this class, except that if the last (or only) name element is indexed, the descriptor for the last resolved property itself is returned.

    FIXME - Does not work with DynaBeans.

    Note that for Java 8 and above, this method no longer return IndexedPropertyDescriptor for `List`-typed properties, only for properties typed as native array. (BEANUTILS-492).

    Parameters:
      `bean` - Bean for which a property descriptor is requested
      `name` - Possibly indexed and/or nested name of the property for which a property descriptor is requested
    Returns:
      the property descriptor
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `IllegalArgumentException` - if a nested reference to a property returns null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getPropertyDescriptors

    public PropertyDescriptor[] getPropertyDescriptors(Class<?> beanClass)

    Retrieve the property descriptors for the specified class, introspecting and caching them the first time a particular bean class is encountered.

    FIXME - Does not work with DynaBeans.

    Parameters:
      `beanClass` - Bean class for which property descriptors are requested
    Returns:
      the property descriptors
    Throws:
      `IllegalArgumentException` - if `beanClass` is null

  - ### getPropertyDescriptors

    public PropertyDescriptor[] getPropertyDescriptors(Object bean)

    Retrieve the property descriptors for the specified bean, introspecting and caching them the first time a particular bean class is encountered.

    FIXME - Does not work with DynaBeans.

    Parameters:
      `bean` - Bean for which property descriptors are requested
    Returns:
      the property descriptors
    Throws:
      `IllegalArgumentException` - if `bean` is null

  - ### getPropertyEditorClass

    public Class<?> getPropertyEditorClass(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException

    Return the Java Class repesenting the property editor class that has been registered for this property (if any). This method follows the same name resolution rules used by `getPropertyDescriptor()`, so if the last element of a name reference is indexed, the property editor for the underlying property's class is returned.

    Note that `null` will be returned if there is no property, or if there is no registered property editor class. Because this return value is ambiguous, you should determine the existence of the property itself by other means.

    FIXME - Does not work with DynaBeans.

    Parameters:
      `bean` - Bean for which a property descriptor is requested
      `name` - Possibly indexed and/or nested name of the property for which a property descriptor is requested
    Returns:
      the property editor class
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `IllegalArgumentException` - if a nested reference to a property returns null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getPropertyOfMapBean

    protected Object getPropertyOfMapBean(Map<?,?> bean, String propertyName) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException
    This method is called by getNestedProperty and setNestedProperty to define what it means to get a property from an object which implements Map. See setPropertyOfMapBean for more information.
    Parameters:
      `bean` - Map bean
      `propertyName` - The property name
    Returns:
      the property value
    Throws:
      `IllegalArgumentException` - when the propertyName is regarded as being invalid.
      `IllegalAccessException` - just in case subclasses override this method to try to access real getter methods and find permission is denied.
      `InvocationTargetException` - just in case subclasses override this method to try to access real getter methods, and find it throws an exception when invoked.
      `NoSuchMethodException` - just in case subclasses override this method to try to access real getter methods, and want to fail if no simple method is available.
    Since:
      1.8.0

  - ### getPropertyType

    public Class<?> getPropertyType(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the Java Class representing the property type of the specified property, or `null` if there is no such property for the specified bean. This method follows the same name resolution rules used by `getPropertyDescriptor()`, so if the last element of a name reference is indexed, the type of the property itself will be returned. If the last (or only) element has no property with the specified name, `null` is returned.

    If the property is an indexed property (e.g. `String[]`), this method will return the type of the items within that array. Note that from Java 8 and newer, this method do not support such index types from items within an Collection, and will instead return the collection type (e.g. java.util.List) from the getter method.

    Parameters:
      `bean` - Bean for which a property descriptor is requested
      `name` - Possibly indexed and/or nested name of the property for which a property descriptor is requested
    Returns:
      The property type
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `IllegalArgumentException` - if a nested reference to a property returns null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getReadMethod

    public Method getReadMethod(Class<?> clazz, PropertyDescriptor descriptor)

    Return the property getter method for this property if accessible from given `clazz` (and if there is one at all); otherwise return `null`.

    FIXME - Does not work with DynaBeans.

    This fairly low-level method shouldn't be needed for most usecases. However, if you do have to implement something extra, you can improve consistency with the standard code (e.g. that of `getProperty()`) by calling this method instead of using `descriptor.getReadMethod()` directly.

    Parameters:
      `clazz` - The class of the read method will be invoked on
      `descriptor` - Property descriptor to return a getter for
    Returns:
      The read method
    Since:
      2.0.0

  - ### getReadMethod

    public Method getReadMethod(PropertyDescriptor descriptor)

    Return an accessible property getter method for this property, if there is one; otherwise return `null`.

    FIXME - Does not work with DynaBeans.

    Parameters:
      `descriptor` - Property descriptor to return a getter for
    Returns:
      The read method

  - ### getResolver

    public Resolver getResolver()
    Gets the configured `Resolver` implementation used by BeanUtils.

    The `Resolver` handles the property name expressions and the implementation in use effectively controls the dialect of the expression language that BeanUtils recognizes.

    `DefaultResolver` is the default implementation used.

    Returns:
      resolver The property expression resolver.
    Since:
      1.8.0

  - ### getSimpleProperty

    public Object getSimpleProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Gets the value of the specified simple property of the specified bean, with no type conversions.
    Parameters:
      `bean` - Bean whose property is to be extracted
      `name` - Name of the property to be extracted
    Returns:
      The property value
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `IllegalArgumentException` - if the property name is nested or indexed
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### getWriteMethod

    public Method getWriteMethod(Class<?> clazz, PropertyDescriptor descriptor)

    Return the property setter method for this property if accessible from given `clazz` (and if there is one at all); otherwise return `null`.

    FIXME - Does not work with DynaBeans.

    This fairly low-level method shouldn't be needed for most usecases. However, if you do have to implement something extra, you can improve consistency with the standard code (e.g. that of `setProperty()`) by calling this method instead of using `descriptor.getWriteMethod()` directly.

    Parameters:
      `clazz` - The class of the read method will be invoked on
      `descriptor` - Property descriptor to return a setter for
    Returns:
      The write method
    Since:
      1.9.1

  - ### getWriteMethod

    public Method getWriteMethod(PropertyDescriptor descriptor)

    Return an accessible property setter method for this property, if there is one; otherwise return `null`.

    Note: This method does not work correctly with custom bean introspection under certain circumstances. It may return `null` even if a write method is defined for the property in question. Use `getWriteMethod(Class, PropertyDescriptor)` to be sure that the correct result is returned.

    FIXME - Does not work with DynaBeans.

    Parameters:
      `descriptor` - Property descriptor to return a setter for
    Returns:
      The write method

  - ### isReadable

    public boolean isReadable(Object bean, String name)
    Return `true` if the specified property name identifies a readable property on the specified bean; otherwise, return `false`.
    Parameters:
      `bean` - Bean to be examined (may be a `DynaBean`
      `name` - Property name to be evaluated
    Returns:
      `true` if the property is readable, otherwise `false`
    Throws:
      `IllegalArgumentException` - if `bean` or `name</code> is <code>null`
    Since:
      1.6

  - ### isWriteable

    public boolean isWriteable(Object bean, String name)
    Return `true` if the specified property name identifies a writable property on the specified bean; otherwise, return `false`.
    Parameters:
      `bean` - Bean to be examined (may be a `DynaBean`
      `name` - Property name to be evaluated
    Returns:
      `true` if the property is writable, otherwise `false`
    Throws:
      `IllegalArgumentException` - if `bean` or `name</code> is <code>null`
    Since:
      1.6

  - ### removeBeanIntrospector

    public boolean removeBeanIntrospector(BeanIntrospector introspector)
    Removes the specified `BeanIntrospector`.
    Parameters:
      `introspector` - the `BeanIntrospector` to be removed
    Returns:
      true if the `BeanIntrospector` existed and could be removed, false otherwise
    Since:
      1.9

  - ### resetBeanIntrospectors

    public final void resetBeanIntrospectors()
    Resets the `BeanIntrospector` objects registered at this instance. After this method was called, only the default `BeanIntrospector` is registered.
    Since:
      1.9

  - ### setIndexedProperty

    public void setIndexedProperty(Object bean, String name, int index, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Sets the value of the specified indexed property of the specified bean, with no type conversions. In addition to supporting the JavaBeans specification, this method has been extended to support `List` objects as well.
    Parameters:
      `bean` - Bean whose property is to be set
      `name` - Simple property name of the property value to be set
      `index` - Index of the property value to be set
      `value` - Value to which the indexed property element is to be set
    Throws:
      `IndexOutOfBoundsException` - if the specified index is outside the valid range for the underlying property
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### setIndexedProperty

    public void setIndexedProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Sets the value of the specified indexed property of the specified bean, with no type conversions. The zero-relative index of the required value must be included (in square brackets) as a suffix to the property name, or `IllegalArgumentException` will be thrown. In addition to supporting the JavaBeans specification, this method has been extended to support `List` objects as well.
    Parameters:
      `bean` - Bean whose property is to be modified
      `name` - `propertyname[index]` of the property value to be modified
      `value` - Value to which the specified property element should be set
    Throws:
      `IndexOutOfBoundsException` - if the specified index is outside the valid range for the underlying property
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### setMappedProperty

    public void setMappedProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Sets the value of the specified mapped property of the specified bean, with no type conversions. The key of the value to set must be included (in brackets) as a suffix to the property name, or `IllegalArgumentException` will be thrown.
    Parameters:
      `bean` - Bean whose property is to be set
      `name` - `propertyname(key)` of the property value to be set
      `value` - The property value to be set
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### setMappedProperty

    public void setMappedProperty(Object bean, String name, String key, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Sets the value of the specified mapped property of the specified bean, with no type conversions.
    Parameters:
      `bean` - Bean whose property is to be set
      `name` - Mapped property name of the property value to be set
      `key` - Key of the property value to be set
      `value` - The property value to be set
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### setNestedProperty

    public void setNestedProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Sets the value of the (possibly nested) property of the specified name, for the specified bean, with no type conversions.

    Example values for parameter "name" are:

    - "a" -- sets the value of property a of the specified bean
    - "a.b" -- gets the value of property a of the specified bean, then on that object sets the value of property b.
    - "a(key)" -- sets a value of mapped-property a on the specified bean. This effectively means bean.setA("key").
    - "a[3]" -- sets a value of indexed-property a on the specified bean. This effectively means bean.setA(3).
    Parameters:
      `bean` - Bean whose property is to be modified
      `name` - Possibly nested name of the property to be modified
      `value` - Value to which the property is to be set
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `IllegalArgumentException` - if a nested reference to a property returns null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### setProperty

    public void setProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Sets the value of the specified property of the specified bean, no matter which property reference format is used, with no type conversions.
    Parameters:
      `bean` - Bean whose property is to be modified
      `name` - Possibly indexed and/or nested name of the property to be modified
      `value` - Value to which this property is to be set
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found

  - ### setPropertyOfMapBean

    protected void setPropertyOfMapBean(Map<String,Object> bean, String propertyName, Object value) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException
    This method is called by method setNestedProperty when the current bean is found to be a Map object, and defines how to deal with setting a property on a Map.

    The standard implementation here is to:

    - call bean.set(propertyName) for all propertyName values.
    - throw an IllegalArgumentException if the property specifier contains MAPPED_DELIM or INDEXED_DELIM, as Map entries are essentially simple properties; mapping and indexing operations do not make sense when accessing a map (even thought the returned object may be a Map or an Array).

    The default behavior of BeanUtils 1.7.1 or later is for assigning to "a.b" to mean a.put(b, obj) always. However the behavior of BeanUtils version 1.6.0, 1.6.1, 1.7.0 was for "a.b" to mean a.setB(obj) if such a method existed, and a.put(b, obj) otherwise. In version 1.5 it meant a.put(b, obj) always (ie the same as the behavior in the current version). In versions prior to 1.5 it meant a.setB(obj) always. [yes, this is all very unfortunate]

    Users who would like to customize the meaning of "a.b" in method setNestedProperty when a is a Map can create a custom subclass of this class and override this method to implement the behavior of their choice, such as restoring the pre-1.4 behavior of this class if they wish. When overriding this method, do not forget to deal with MAPPED_DELIM and INDEXED_DELIM characters in the propertyName.

    Note, however, that the recommended solution for objects that implement Map but want their simple properties to come first is for those objects to override their get/put methods to implement that behavior, and not to solve the problem by modifying the default behavior of the PropertyUtilsBean class by overriding this method.

    Parameters:
      `bean` - Map bean
      `propertyName` - The property name
      `value` - the property value
    Throws:
      `IllegalArgumentException` - when the propertyName is regarded as being invalid.
      `IllegalAccessException` - just in case subclasses override this method to try to access real setter methods and find permission is denied.
      `InvocationTargetException` - just in case subclasses override this method to try to access real setter methods, and find it throws an exception when invoked.
      `NoSuchMethodException` - just in case subclasses override this method to try to access real setter methods, and want to fail if no simple method is available.
    Since:
      1.8.0

  - ### setResolver

    public void setResolver(Resolver resolver)
    Configure the `Resolver` implementation used by BeanUtils.

    The `Resolver` handles the property name expressions and the implementation in use effectively controls the dialect of the expression language that BeanUtils recognizes.

    `DefaultResolver` is the default implementation used.

    Parameters:
      `resolver` - The property expression resolver.
    Since:
      1.8.0

  - ### setSimpleProperty

    public void setSimpleProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
    Sets the value of the specified simple property of the specified bean, with no type conversions.
    Parameters:
      `bean` - Bean whose property is to be modified
      `name` - Name of the property to be modified
      `value` - Value to which the property should be set
    Throws:
      `IllegalAccessException` - if the caller does not have access to the property accessor method
      `IllegalArgumentException` - if `bean` or `name` is null
      `IllegalArgumentException` - if the property name is nested or indexed
      `InvocationTargetException` - if the property accessor method throws an exception
      `NoSuchMethodException` - if an accessor method for this property cannot be found