View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.beanutils2;
19  
20  import java.beans.PropertyDescriptor;
21  import java.lang.reflect.InvocationTargetException;
22  import java.lang.reflect.Method;
23  import java.util.Map;
24  
25  /**
26   * <p>
27   * Utility methods for using Java Reflection APIs to facilitate generic property getter and setter operations on Java objects.
28   * </p>
29   *
30   * <p>
31   * The implementations for these methods are provided by {@code PropertyUtilsBean}. For more details see {@link PropertyUtilsBean}.
32   * </p>
33   *
34   * @see PropertyUtilsBean
35   * @see org.apache.commons.beanutils2.expression.Resolver
36   */
37  
38  public final class PropertyUtils {
39  
40      /**
41       * Adds a {@code BeanIntrospector}. This object is invoked when the property descriptors of a class need to be obtained.
42       *
43       * @param introspector the {@code BeanIntrospector} to be added (must not be <strong>null</strong>
44       * @throws IllegalArgumentException if the argument is <strong>null</strong>
45       * @since 1.9
46       */
47      public static void addBeanIntrospector(final BeanIntrospector introspector) {
48          PropertyUtilsBean.getInstance().addBeanIntrospector(introspector);
49      }
50  
51      /**
52       * Clear any cached property descriptors information for all classes loaded by any class loaders. This is useful in cases where class loaders are thrown
53       * away to implement class reloading.
54       *
55       * <p>
56       * For more details see {@code PropertyUtilsBean}.
57       * </p>
58       *
59       * @see PropertyUtilsBean#clearDescriptors
60       */
61      public static void clearDescriptors() {
62          PropertyUtilsBean.getInstance().clearDescriptors();
63      }
64  
65      /**
66       * <p>
67       * 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
68       * and setter methods might have been customized via {@code BeanInfo} classes).
69       * </p>
70       *
71       * <p>
72       * For more details see {@code PropertyUtilsBean}.
73       * </p>
74       *
75       * @param dest Destination bean whose properties are modified
76       * @param orig Origin bean whose properties are retrieved
77       * @throws IllegalAccessException    if the caller does not have access to the property accessor method
78       * @throws IllegalArgumentException  if the {@code dest} or {@code orig} argument is null
79       * @throws InvocationTargetException if the property accessor method throws an exception
80       * @throws NoSuchMethodException     if an accessor method for this property cannot be found
81       * @see PropertyUtilsBean#copyProperties
82       */
83      public static void copyProperties(final Object dest, final Object orig) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
84          PropertyUtilsBean.getInstance().copyProperties(dest, orig);
85      }
86  
87      /**
88       * <p>
89       * Return the entire set of properties for which the specified bean provides a read method.
90       * </p>
91       *
92       * <p>
93       * For more details see {@code PropertyUtilsBean}.
94       * </p>
95       *
96       * @param bean Bean whose properties are to be extracted
97       * @return The set of properties for the bean
98       * @throws IllegalAccessException    if the caller does not have access to the property accessor method
99       * @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 }