    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *      https://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017
    018package org.apache.commons.beanutils2;
    019
    020import java.beans.PropertyDescriptor;
    021import java.lang.reflect.InvocationTargetException;
    022import java.lang.reflect.Method;
    023import java.util.Map;
    024
    025/**
    026 * <p>
    027 * Utility methods for using Java Reflection APIs to facilitate generic property getter and setter operations on Java objects.
    028 * </p>
    029 *
    030 * <p>
    031 * The implementations for these methods are provided by {@code PropertyUtilsBean}. For more details see {@link PropertyUtilsBean}.
    032 * </p>
    033 *
    034 * @see PropertyUtilsBean
    035 * @see org.apache.commons.beanutils2.expression.Resolver
    036 */
    037
    038public final class PropertyUtils {
    039
    040    /**
    041     * Adds a {@code BeanIntrospector}. This object is invoked when the property descriptors of a class need to be obtained.
    042     *
    043     * @param introspector the {@code BeanIntrospector} to be added (must not be <strong>null</strong>
    044     * @throws IllegalArgumentException if the argument is <strong>null</strong>
    045     * @since 1.9
    046     */
    047    public static void addBeanIntrospector(final BeanIntrospector introspector) {
    048        PropertyUtilsBean.getInstance().addBeanIntrospector(introspector);
    049    }
    050
    051    /**
    052     * Clear any cached property descriptors information for all classes loaded by any class loaders. This is useful in cases where class loaders are thrown
    053     * away to implement class reloading.
    054     *
    055     * <p>
    056     * For more details see {@code PropertyUtilsBean}.
    057     * </p>
    058     *
    059     * @see PropertyUtilsBean#clearDescriptors
    060     */
    061    public static void clearDescriptors() {
    062        PropertyUtilsBean.getInstance().clearDescriptors();
    063    }
    064
    065    /**
    066     * <p>
    067     * 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
    068     * and setter methods might have been customized via {@code BeanInfo} classes).
    069     * </p>
    070     *
    071     * <p>
    072     * For more details see {@code PropertyUtilsBean}.
    073     * </p>
    074     *
    075     * @param dest Destination bean whose properties are modified
    076     * @param orig Origin bean whose properties are retrieved
    077     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    078     * @throws IllegalArgumentException  if the {@code dest} or {@code orig} argument is null
    079     * @throws InvocationTargetException if the property accessor method throws an exception
    080     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    081     * @see PropertyUtilsBean#copyProperties
    082     */
    083    public static void copyProperties(final Object dest, final Object orig) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    084        PropertyUtilsBean.getInstance().copyProperties(dest, orig);
    085    }
    086
    087    /**
    088     * <p>
    089     * Return the entire set of properties for which the specified bean provides a read method.
    090     * </p>
    091     *
    092     * <p>
    093     * For more details see {@code PropertyUtilsBean}.
    094     * </p>
    095     *
    096     * @param bean Bean whose properties are to be extracted
    097     * @return The set of properties for the bean
    098     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    099     * @throws IllegalArgumentException  if {@code bean} is null
    100     * @throws InvocationTargetException if the property accessor method throws an exception
    101     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    102     * @see PropertyUtilsBean#describe
    103     */
    104    public static Map<String, Object> describe(final Object bean) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    105        return PropertyUtilsBean.getInstance().describe(bean);
    106    }
    107
    108    /**
    109     * <p>
    110     * Return the value of the specified indexed property of the specified bean, with no type conversions.
    111     * </p>
    112     *
    113     * <p>
    114     * For more details see {@code PropertyUtilsBean}.
    115     * </p>
    116     *
    117     * @param bean Bean whose property is to be extracted
    118     * @param name {@code propertyname[index]} of the property value to be extracted
    119     * @return the indexed property value
    120     * @throws IndexOutOfBoundsException if the specified index is outside the valid range for the underlying property
    121     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    122     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    123     * @throws InvocationTargetException if the property accessor method throws an exception
    124     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    125     * @see PropertyUtilsBean#getIndexedProperty(Object,String)
    126     */
    127    public static Object getIndexedProperty(final Object bean, final String name)
    128            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    129        return PropertyUtilsBean.getInstance().getIndexedProperty(bean, name);
    130    }
    131
    132    /**
    133     * <p>
    134     * Return the value of the specified indexed property of the specified bean, with no type conversions.
    135     * </p>
    136     *
    137     * <p>
    138     * For more details see {@code PropertyUtilsBean}.
    139     * </p>
    140     *
    141     * @param bean  Bean whose property is to be extracted
    142     * @param name  Simple property name of the property value to be extracted
    143     * @param index Index of the property value to be extracted
    144     * @return the indexed property value
    145     * @throws IndexOutOfBoundsException if the specified index is outside the valid range for the underlying property
    146     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    147     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    148     * @throws InvocationTargetException if the property accessor method throws an exception
    149     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    150     * @see PropertyUtilsBean#getIndexedProperty(Object,String, int)
    151     */
    152    public static Object getIndexedProperty(final Object bean, final String name, final int index)
    153            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    154        return PropertyUtilsBean.getInstance().getIndexedProperty(bean, name, index);
    155    }
    156
    157    /**
    158     * <p>
    159     * Return the value of the specified mapped property of the specified bean, with no type conversions.
    160     * </p>
    161     *
    162     * <p>
    163     * For more details see {@code PropertyUtilsBean}.
    164     * </p>
    165     *
    166     * @param bean Bean whose property is to be extracted
    167     * @param name {@code propertyname(key)} of the property value to be extracted
    168     * @return the mapped property value
    169     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    170     * @throws InvocationTargetException if the property accessor method throws an exception
    171     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    172     * @see PropertyUtilsBean#getMappedProperty(Object,String)
    173     */
    174    public static Object getMappedProperty(final Object bean, final String name)
    175            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    176        return PropertyUtilsBean.getInstance().getMappedProperty(bean, name);
    177    }
    178
    179    /**
    180     * <p>
    181     * Return the value of the specified mapped property of the specified bean, with no type conversions.
    182     * </p>
    183     *
    184     * <p>
    185     * For more details see {@code PropertyUtilsBean}.
    186     * </p>
    187     *
    188     * @param bean Bean whose property is to be extracted
    189     * @param name Mapped property name of the property value to be extracted
    190     * @param key  Key of the property value to be extracted
    191     * @return the mapped property value
    192     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    193     * @throws InvocationTargetException if the property accessor method throws an exception
    194     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    195     * @see PropertyUtilsBean#getMappedProperty(Object,String, String)
    196     */
    197    public static Object getMappedProperty(final Object bean, final String name, final String key)
    198            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    199        return PropertyUtilsBean.getInstance().getMappedProperty(bean, name, key);
    200    }
    201
    202    /**
    203     * <p>
    204     * Return the mapped property descriptors for this bean class.
    205     * </p>
    206     *
    207     * <p>
    208     * For more details see {@code PropertyUtilsBean}.
    209     * </p>
    210     *
    211     * @param beanClass Bean class to be introspected
    212     * @return the mapped property descriptors
    213     * @see PropertyUtilsBean#getMappedPropertyDescriptors(Class)
    214     */
    215    static Map<Class<?>, Map> getMappedPropertyDescriptors(final Class<?> beanClass) {
    216        return PropertyUtilsBean.getInstance().getMappedPropertyDescriptors(beanClass);
    217    }
    218
    219    /**
    220     * <p>
    221     * Return the value of the (possibly nested) property of the specified name, for the specified bean, with no type conversions.
    222     * </p>
    223     *
    224     * <p>
    225     * For more details see {@code PropertyUtilsBean}.
    226     * </p>
    227     *
    228     * @param bean Bean whose property is to be extracted
    229     * @param name Possibly nested name of the property to be extracted
    230     * @return the nested property value
    231     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    232     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    233     * @throws NestedNullException       if a nested reference to a property returns null
    234     * @throws InvocationTargetException if the property accessor method throws an exception
    235     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    236     * @see PropertyUtilsBean#getNestedProperty
    237     */
    238    public static Object getNestedProperty(final Object bean, final String name)
    239            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    240        return PropertyUtilsBean.getInstance().getNestedProperty(bean, name);
    241    }
    242
    243    /**
    244     * <p>
    245     * Return the value of the specified property of the specified bean, no matter which property reference format is used, with no type conversions.
    246     * </p>
    247     *
    248     * <p>
    249     * For more details see {@code PropertyUtilsBean}.
    250     * </p>
    251     *
    252     * @param bean Bean whose property is to be extracted
    253     * @param name Possibly indexed and/or nested name of the property to be extracted
    254     * @return the property value
    255     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    256     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    257     * @throws InvocationTargetException if the property accessor method throws an exception
    258     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    259     * @see PropertyUtilsBean#getProperty
    260     */
    261    public static Object getProperty(final Object bean, final String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    262        return PropertyUtilsBean.getInstance().getProperty(bean, name);
    263    }
    264
    265    /**
    266     * <p>
    267     * Retrieve the property descriptor for the specified property of the specified bean, or return {@code null} if there is no such descriptor.
    268     * </p>
    269     *
    270     * <p>
    271     * For more details see {@code PropertyUtilsBean}.
    272     * </p>
    273     *
    274     * @param bean Bean for which a property descriptor is requested
    275     * @param name Possibly indexed and/or nested name of the property for which a property descriptor is requested
    276     * @return the property descriptor
    277     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    278     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    279     * @throws IllegalArgumentException  if a nested reference to a property returns null
    280     * @throws InvocationTargetException if the property accessor method throws an exception
    281     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    282     * @see PropertyUtilsBean#getPropertyDescriptor
    283     */
    284    public static PropertyDescriptor getPropertyDescriptor(final Object bean, final String name)
    285            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    286        return PropertyUtilsBean.getInstance().getPropertyDescriptor(bean, name);
    287    }
    288
    289    /**
    290     * <p>
    291     * Retrieve the property descriptors for the specified class, introspecting and caching them the first time a particular bean class is encountered.
    292     * </p>
    293     *
    294     * <p>
    295     * For more details see {@code PropertyUtilsBean}.
    296     * </p>
    297     *
    298     * @param beanClass Bean class for which property descriptors are requested
    299     * @return the property descriptors
    300     * @throws IllegalArgumentException if {@code beanClass} is null
    301     * @see PropertyUtilsBean#getPropertyDescriptors(Class)
    302     */
    303    public static PropertyDescriptor[] getPropertyDescriptors(final Class<?> beanClass) {
    304        return PropertyUtilsBean.getInstance().getPropertyDescriptors(beanClass);
    305    }
    306
    307    /**
    308     * <p>
    309     * Retrieve the property descriptors for the specified bean, introspecting and caching them the first time a particular bean class is encountered.
    310     * </p>
    311     *
    312     * <p>
    313     * For more details see {@code PropertyUtilsBean}.
    314     * </p>
    315     *
    316     * @param bean Bean for which property descriptors are requested
    317     * @return the property descriptors
    318     * @throws IllegalArgumentException if {@code bean} is null
    319     * @see PropertyUtilsBean#getPropertyDescriptors(Object)
    320     */
    321    public static PropertyDescriptor[] getPropertyDescriptors(final Object bean) {
    322        return PropertyUtilsBean.getInstance().getPropertyDescriptors(bean);
    323    }
    324
    325    /**
    326     * <p>
    327     * Return the Java Class representing the property editor class that has been registered for this property (if any).
    328     * </p>
    329     *
    330     * <p>
    331     * For more details see {@code PropertyUtilsBean}.
    332     * </p>
    333     *
    334     * @param bean Bean for which a property descriptor is requested
    335     * @param name Possibly indexed and/or nested name of the property for which a property descriptor is requested
    336     * @return the property editor class
    337     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    338     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    339     * @throws IllegalArgumentException  if a nested reference to a property returns null
    340     * @throws InvocationTargetException if the property accessor method throws an exception
    341     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    342     * @see PropertyUtilsBean#getPropertyEditorClass(Object,String)
    343     */
    344    public static Class<?> getPropertyEditorClass(final Object bean, final String name)
    345            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    346        return PropertyUtilsBean.getInstance().getPropertyEditorClass(bean, name);
    347    }
    348
    349    /**
    350     * <p>
    351     * Return the Java Class representing the property type of the specified property, or {@code null} if there is no such property for the specified bean.
    352     * </p>
    353     *
    354     * <p>
    355     * For more details see {@code PropertyUtilsBean}.
    356     * </p>
    357     *
    358     * @param bean Bean for which a property descriptor is requested
    359     * @param name Possibly indexed and/or nested name of the property for which a property descriptor is requested
    360     * @return The property type
    361     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    362     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    363     * @throws IllegalArgumentException  if a nested reference to a property returns null
    364     * @throws InvocationTargetException if the property accessor method throws an exception
    365     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    366     * @see PropertyUtilsBean#getPropertyType(Object, String)
    367     */
    368    public static Class<?> getPropertyType(final Object bean, final String name)
    369            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    370        return PropertyUtilsBean.getInstance().getPropertyType(bean, name);
    371    }
    372
    373    /**
    374     * <p>
    375     * Return an accessible property getter method for this property, if there is one; otherwise return {@code null}.
    376     * </p>
    377     *
    378     * <p>
    379     * For more details see {@code PropertyUtilsBean}.
    380     * </p>
    381     *
    382     * @param descriptor Property descriptor to return a getter for
    383     * @return The read method
    384     * @see PropertyUtilsBean#getReadMethod(PropertyDescriptor)
    385     */
    386    public static Method getReadMethod(final PropertyDescriptor descriptor) {
    387        return PropertyUtilsBean.getInstance().getReadMethod(descriptor);
    388    }
    389
    390    /**
    391     * <p>
    392     * Return the value of the specified simple property of the specified bean, with no type conversions.
    393     * </p>
    394     *
    395     * <p>
    396     * For more details see {@code PropertyUtilsBean}.
    397     * </p>
    398     *
    399     * @param bean Bean whose property is to be extracted
    400     * @param name Name of the property to be extracted
    401     * @return The property value
    402     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    403     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    404     * @throws IllegalArgumentException  if the property name is nested or indexed
    405     * @throws InvocationTargetException if the property accessor method throws an exception
    406     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    407     * @see PropertyUtilsBean#getSimpleProperty
    408     */
    409    public static Object getSimpleProperty(final Object bean, final String name)
    410            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    411        return PropertyUtilsBean.getInstance().getSimpleProperty(bean, name);
    412    }
    413
    414    /**
    415     * <p>
    416     * Return an accessible property setter method for this property, if there is one; otherwise return {@code null}.
    417     * </p>
    418     *
    419     * <p>
    420     * For more details see {@code PropertyUtilsBean}.
    421     * </p>
    422     *
    423     * @param descriptor Property descriptor to return a setter for
    424     * @return The write method
    425     * @see PropertyUtilsBean#getWriteMethod(PropertyDescriptor)
    426     */
    427    public static Method getWriteMethod(final PropertyDescriptor descriptor) {
    428        return PropertyUtilsBean.getInstance().getWriteMethod(descriptor);
    429    }
    430
    431    /**
    432     * <p>
    433     * Return {@code true} if the specified property name identifies a readable property on the specified bean; otherwise, return {@code false}.
    434     * </p>
    435     *
    436     * <p>
    437     * For more details see {@code PropertyUtilsBean}.
    438     * </p>
    439     *
    440     * @param bean Bean to be examined (may be a {@link DynaBean}
    441     * @param name Property name to be evaluated
    442     * @return {@code true} if the property is readable, otherwise {@code false}
    443     * @throws IllegalArgumentException if {@code bean} or {@code name</code> is <code>null}
    444     * @see PropertyUtilsBean#isReadable
    445     * @since 1.6
    446     */
    447    public static boolean isReadable(final Object bean, final String name) {
    448        return PropertyUtilsBean.getInstance().isReadable(bean, name);
    449    }
    450
    451    /**
    452     * <p>
    453     * Return {@code true} if the specified property name identifies a writable property on the specified bean; otherwise, return {@code false}.
    454     * </p>
    455     *
    456     * <p>
    457     * For more details see {@code PropertyUtilsBean}.
    458     * </p>
    459     *
    460     * @param bean Bean to be examined (may be a {@link DynaBean}
    461     * @param name Property name to be evaluated
    462     * @return {@code true} if the property is writable, otherwise {@code false}
    463     * @throws IllegalArgumentException if {@code bean} or {@code name</code> is <code>null}
    464     * @see PropertyUtilsBean#isWriteable
    465     * @since 1.6
    466     */
    467    public static boolean isWriteable(final Object bean, final String name) {
    468        return PropertyUtilsBean.getInstance().isWriteable(bean, name);
    469    }
    470
    471    /**
    472     * Removes the specified {@code BeanIntrospector}.
    473     *
    474     * @param introspector the {@code BeanIntrospector} to be removed
    475     * @return <strong>true</strong> if the {@code BeanIntrospector} existed and could be removed, <strong>false</strong> otherwise
    476     * @since 1.9
    477     */
    478    public static boolean removeBeanIntrospector(final BeanIntrospector introspector) {
    479        return PropertyUtilsBean.getInstance().removeBeanIntrospector(introspector);
    480    }
    481
    482    /**
    483     * Resets the registered {@link BeanIntrospector} objects to the initial default state.
    484     *
    485     * @since 1.9
    486     */
    487    public static void resetBeanIntrospectors() {
    488        PropertyUtilsBean.getInstance().resetBeanIntrospectors();
    489    }
    490
    491    /**
    492     * <p>
    493     * Sets the value of the specified indexed property of the specified bean, with no type conversions.
    494     * </p>
    495     *
    496     * <p>
    497     * For more details see {@code PropertyUtilsBean}.
    498     * </p>
    499     *
    500     * @param bean  Bean whose property is to be set
    501     * @param name  Simple property name of the property value to be set
    502     * @param index Index of the property value to be set
    503     * @param value Value to which the indexed property element is to be set
    504     * @throws IndexOutOfBoundsException if the specified index is outside the valid range for the underlying property
    505     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    506     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    507     * @throws InvocationTargetException if the property accessor method throws an exception
    508     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    509     * @see PropertyUtilsBean#setIndexedProperty(Object, String, Object)
    510     */
    511    public static void setIndexedProperty(final Object bean, final String name, final int index, final Object value)
    512            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    513        PropertyUtilsBean.getInstance().setIndexedProperty(bean, name, index, value);
    514    }
    515
    516    /**
    517     * <p>
    518     * Sets the value of the specified indexed property of the specified bean, with no type conversions.
    519     * </p>
    520     *
    521     * <p>
    522     * For more details see {@code PropertyUtilsBean}.
    523     * </p>
    524     *
    525     * @param bean  Bean whose property is to be modified
    526     * @param name  {@code propertyname[index]} of the property value to be modified
    527     * @param value Value to which the specified property element should be set
    528     * @throws IndexOutOfBoundsException if the specified index is outside the valid range for the underlying property
    529     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    530     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    531     * @throws InvocationTargetException if the property accessor method throws an exception
    532     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    533     * @see PropertyUtilsBean#setIndexedProperty(Object, String, Object)
    534     */
    535    public static void setIndexedProperty(final Object bean, final String name, final Object value)
    536            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    537        PropertyUtilsBean.getInstance().setIndexedProperty(bean, name, value);
    538    }
    539
    540    /**
    541     * <p>
    542     * Sets the value of the specified mapped property of the specified bean, with no type conversions.
    543     * </p>
    544     *
    545     * <p>
    546     * For more details see {@code PropertyUtilsBean}.
    547     * </p>
    548     *
    549     * @param bean  Bean whose property is to be set
    550     * @param name  {@code propertyname(key)} of the property value to be set
    551     * @param value The property value to be set
    552     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    553     * @throws InvocationTargetException if the property accessor method throws an exception
    554     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    555     * @see PropertyUtilsBean#setMappedProperty(Object, String, Object)
    556     */
    557    public static void setMappedProperty(final Object bean, final String name, final Object value)
    558            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    559        PropertyUtilsBean.getInstance().setMappedProperty(bean, name, value);
    560    }
    561
    562    /**
    563     * <p>
    564     * Sets the value of the specified mapped property of the specified bean, with no type conversions.
    565     * </p>
    566     *
    567     * <p>
    568     * For more details see {@code PropertyUtilsBean}.
    569     * </p>
    570     *
    571     * @param bean  Bean whose property is to be set
    572     * @param name  Mapped property name of the property value to be set
    573     * @param key   Key of the property value to be set
    574     * @param value The property value to be set
    575     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    576     * @throws InvocationTargetException if the property accessor method throws an exception
    577     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    578     * @see PropertyUtilsBean#setMappedProperty(Object, String, String, Object)
    579     */
    580    public static void setMappedProperty(final Object bean, final String name, final String key, final Object value)
    581            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    582        PropertyUtilsBean.getInstance().setMappedProperty(bean, name, key, value);
    583    }
    584
    585    /**
    586     * <p>
    587     * Sets the value of the (possibly nested) property of the specified name, for the specified bean, with no type conversions.
    588     * </p>
    589     *
    590     * <p>
    591     * For more details see {@code PropertyUtilsBean}.
    592     * </p>
    593     *
    594     * @param bean  Bean whose property is to be modified
    595     * @param name  Possibly nested name of the property to be modified
    596     * @param value Value to which the property is to be set
    597     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    598     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    599     * @throws IllegalArgumentException  if a nested reference to a property returns null
    600     * @throws InvocationTargetException if the property accessor method throws an exception
    601     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    602     * @see PropertyUtilsBean#setNestedProperty
    603     */
    604    public static void setNestedProperty(final Object bean, final String name, final Object value)
    605            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    606        PropertyUtilsBean.getInstance().setNestedProperty(bean, name, value);
    607    }
    608
    609    /**
    610     * <p>
    611     * Set the value of the specified property of the specified bean, no matter which property reference format is used, with no type conversions.
    612     * </p>
    613     *
    614     * <p>
    615     * For more details see {@code PropertyUtilsBean}.
    616     * </p>
    617     *
    618     * @param bean  Bean whose property is to be modified
    619     * @param name  Possibly indexed and/or nested name of the property to be modified
    620     * @param value Value to which this property is to be set
    621     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    622     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    623     * @throws InvocationTargetException if the property accessor method throws an exception
    624     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    625     * @see PropertyUtilsBean#setProperty
    626     */
    627    public static void setProperty(final Object bean, final String name, final Object value)
    628            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    629        PropertyUtilsBean.getInstance().setProperty(bean, name, value);
    630    }
    631
    632    /**
    633     * <p>
    634     * Set the value of the specified simple property of the specified bean, with no type conversions.
    635     * </p>
    636     *
    637     * <p>
    638     * For more details see {@code PropertyUtilsBean}.
    639     * </p>
    640     *
    641     * @param bean  Bean whose property is to be modified
    642     * @param name  Name of the property to be modified
    643     * @param value Value to which the property should be set
    644     * @throws IllegalAccessException    if the caller does not have access to the property accessor method
    645     * @throws IllegalArgumentException  if {@code bean} or {@code name} is null
    646     * @throws IllegalArgumentException  if the property name is nested or indexed
    647     * @throws InvocationTargetException if the property accessor method throws an exception
    648     * @throws NoSuchMethodException     if an accessor method for this property cannot be found
    649     * @see PropertyUtilsBean#setSimpleProperty
    650     */
    651    public static void setSimpleProperty(final Object bean, final String name, final Object value)
    652            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    653        PropertyUtilsBean.getInstance().setSimpleProperty(bean, name, value);
    654    }
    655
    656    private PropertyUtils() {
    657        // empty
    658    }
    659}