org.apache.commons.beanutils
Class BeanUtils

java.lang.Object
  |
  +--org.apache.commons.beanutils.BeanUtils
Direct Known Subclasses:
LocaleBeanUtils

public class BeanUtils
extends java.lang.Object

Utility methods for populating JavaBeans properties via reflection.

Version:
$Revision: 1.36 $ $Date: 2003/02/04 07:28:14 $
Author:
Craig R. McClanahan, Ralph Schaer, Chris Audley, Rey François, Gregor Raıman

Field Summary
private static int debug
          Deprecated. BeanUtils now uses commons-logging for all log messages. Use your favorite logging tool to configure logging for this class.
private static org.apache.commons.collections.FastHashMap dummy
          Dummy collection from the Commons Collections API, to force a ClassNotFoundException if commons-collections.jar is not present in the runtime classpath, and this class is the first one referenced.
private static org.apache.commons.logging.Log log
          All logging goes through this logger
 
Constructor Summary
BeanUtils()
           
 
Method Summary
static java.lang.Object cloneBean(java.lang.Object bean)
          Clone a bean based on the available property getters and setters, even if the bean class itself does not implement Cloneable.
static void copyProperties(java.lang.Object dest, java.lang.Object orig)
          Copy property values from the origin bean to the destination bean for all cases where the property names are the same.
static void copyProperty(java.lang.Object bean, java.lang.String name, java.lang.Object value)
          Copy the specified property value to the specified destination bean, performing any type conversion that is required.
static java.util.Map describe(java.lang.Object bean)
          Return the entire set of properties for which the specified bean provides a read method.
static java.lang.String[] getArrayProperty(java.lang.Object bean, java.lang.String name)
          Return the value of the specified array property of the specified bean, as a String array.
static int getDebug()
          Deprecated. BeanUtils now uses commons-logging for all log messages. Use your favorite logging tool to configure logging for this class.
static java.lang.String getIndexedProperty(java.lang.Object bean, java.lang.String name)
          Return the value of the specified indexed property of the specified bean, as a String.
static java.lang.String getIndexedProperty(java.lang.Object bean, java.lang.String name, int index)
          Return the value of the specified indexed property of the specified bean, as a String.
static java.lang.String getMappedProperty(java.lang.Object bean, java.lang.String name)
          Return the value of the specified indexed property of the specified bean, as a String.
static java.lang.String getMappedProperty(java.lang.Object bean, java.lang.String name, java.lang.String key)
          Return the value of the specified mapped property of the specified bean, as a String.
static java.lang.String getNestedProperty(java.lang.Object bean, java.lang.String name)
          Return the value of the (possibly nested) property of the specified name, for the specified bean, as a String.
static java.lang.String getProperty(java.lang.Object bean, java.lang.String name)
          Return the value of the specified property of the specified bean, no matter which property reference format is used, as a String.
static java.lang.String getSimpleProperty(java.lang.Object bean, java.lang.String name)
          Return the value of the specified simple property of the specified bean, converted to a String.
static void populate(java.lang.Object bean, java.util.Map properties)
          Populate the JavaBeans properties of the specified bean, based on the specified name/value pairs.
static void setDebug(int newDebug)
          Deprecated. BeanUtils now uses commons-logging for all log messages. Use your favorite logging tool to configure logging for this class.
static void setProperty(java.lang.Object bean, java.lang.String name, java.lang.Object value)
          Set the specified property value, performing type conversions as required to conform to the type of the destination property.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

dummy

private static org.apache.commons.collections.FastHashMap dummy
Dummy collection from the Commons Collections API, to force a ClassNotFoundException if commons-collections.jar is not present in the runtime classpath, and this class is the first one referenced. Otherwise, the ClassNotFoundException thrown by ConvertUtils or PropertyUtils can get masked.


log

private static org.apache.commons.logging.Log log
All logging goes through this logger


debug

private static int debug
Deprecated. BeanUtils now uses commons-logging for all log messages. Use your favorite logging tool to configure logging for this class.

The debugging detail level for this component.

Constructor Detail

BeanUtils

public BeanUtils()
Method Detail

getDebug

public static int getDebug()
Deprecated. BeanUtils now uses commons-logging for all log messages. Use your favorite logging tool to configure logging for this class.


setDebug

public static void setDebug(int newDebug)
Deprecated. BeanUtils now uses commons-logging for all log messages. Use your favorite logging tool to configure logging for this class.


cloneBean

public static java.lang.Object cloneBean(java.lang.Object bean)
                                  throws java.lang.IllegalAccessException,
                                         java.lang.InstantiationException,
                                         java.lang.reflect.InvocationTargetException,
                                         java.lang.NoSuchMethodException
Clone a bean based on the available property getters and setters, even if the bean class itself does not implement Cloneable.

Parameters:
bean - Bean to be cloned
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.InstantiationException - if a new instance of the bean's class cannot be instantiated
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

copyProperties

public static void copyProperties(java.lang.Object dest,
                                  java.lang.Object orig)
                           throws java.lang.IllegalAccessException,
                                  java.lang.reflect.InvocationTargetException

Copy property values from the origin bean to the destination bean for all cases where the property names are the same. For each property, a conversion is attempted as necessary. All combinations of standard JavaBeans and DynaBeans as origin and destination are supported. Properties that exist in the origin bean, but do not exist in the destination bean (or are read-only in the destination bean) are silently ignored.

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 converted (if necessary) and 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.

This method differs from populate(), which was primarily designed for populating JavaBeans from the map of request parameters retrieved on an HTTP request, is that no scalar->indexed or indexed->scalar manipulations are performed. If the origin property is indexed, the destination property must be also.

If you know that no type conversions are required, the copyProperties() method in PropertyUtils will execute faster than this method.

FIXME - Indexed and mapped properties that do not have getter and setter methods for the underlying array or Map are not copied by this method.

Parameters:
dest - Destination bean whose properties are modified
orig - Origin bean whose properties are retrieved
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.IllegalArgumentException - if the dest or orig argument is null
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NullPointerException - if orig or dest is null

copyProperty

public static void copyProperty(java.lang.Object bean,
                                java.lang.String name,
                                java.lang.Object value)
                         throws java.lang.IllegalAccessException,
                                java.lang.reflect.InvocationTargetException

Copy the specified property value to the specified destination bean, performing any type conversion that is required. If the specified bean does not have a property of the specified name, or the property is read only on the destination bean, return without doing anything. If you have custom destination property types, register Converters for them by calling the register() method of ConvertUtils.

IMPLEMENTATION RESTRICTIONS:

Parameters:
bean - Bean on which setting is to be performed
name - Property name (can be nested/indexed/mapped/combo)
value - Value to be set
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception

describe

public static java.util.Map describe(java.lang.Object bean)
                              throws java.lang.IllegalAccessException,
                                     java.lang.reflect.InvocationTargetException,
                                     java.lang.NoSuchMethodException
Return the entire set of properties for which the specified bean provides a read method. This map can be fed back to a call to BeanUtils.populate() to reconsitute the same set of properties, modulo differences for read-only and write-only properties, but only if there are no indexed properties.

Parameters:
bean - Bean whose properties are to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getArrayProperty

public static java.lang.String[] getArrayProperty(java.lang.Object bean,
                                                  java.lang.String name)
                                           throws java.lang.IllegalAccessException,
                                                  java.lang.reflect.InvocationTargetException,
                                                  java.lang.NoSuchMethodException
Return the value of the specified array property of the specified bean, as a String array.

Parameters:
bean - Bean whose property is to be extracted
name - Name of the property to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getIndexedProperty

public static java.lang.String getIndexedProperty(java.lang.Object bean,
                                                  java.lang.String name)
                                           throws java.lang.IllegalAccessException,
                                                  java.lang.reflect.InvocationTargetException,
                                                  java.lang.NoSuchMethodException
Return the value of the specified indexed property of the specified bean, as a String. 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.

Parameters:
bean - Bean whose property is to be extracted
name - propertyname[index] of the property value to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getIndexedProperty

public static java.lang.String getIndexedProperty(java.lang.Object bean,
                                                  java.lang.String name,
                                                  int index)
                                           throws java.lang.IllegalAccessException,
                                                  java.lang.reflect.InvocationTargetException,
                                                  java.lang.NoSuchMethodException
Return the value of the specified indexed property of the specified bean, as a String. The index is specified as a method parameter and must *not* be included in the property name expression

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
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getMappedProperty

public static java.lang.String getMappedProperty(java.lang.Object bean,
                                                 java.lang.String name)
                                          throws java.lang.IllegalAccessException,
                                                 java.lang.reflect.InvocationTargetException,
                                                 java.lang.NoSuchMethodException
Return the value of the specified indexed property of the specified bean, as a String. The String-valued key of the required value must be included (in parentheses) as a suffix to the property name, or IllegalArgumentException will be thrown.

Parameters:
bean - Bean whose property is to be extracted
name - propertyname(index) of the property value to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getMappedProperty

public static java.lang.String getMappedProperty(java.lang.Object bean,
                                                 java.lang.String name,
                                                 java.lang.String key)
                                          throws java.lang.IllegalAccessException,
                                                 java.lang.reflect.InvocationTargetException,
                                                 java.lang.NoSuchMethodException
Return the value of the specified mapped property of the specified bean, as a String. The key is specified as a method parameter and must *not* be included in the property name expression

Parameters:
bean - Bean whose property is to be extracted
name - Simple property name of the property value to be extracted
key - Lookup key of the property value to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getNestedProperty

public static java.lang.String getNestedProperty(java.lang.Object bean,
                                                 java.lang.String name)
                                          throws java.lang.IllegalAccessException,
                                                 java.lang.reflect.InvocationTargetException,
                                                 java.lang.NoSuchMethodException
Return the value of the (possibly nested) property of the specified name, for the specified bean, as a String.

Parameters:
bean - Bean whose property is to be extracted
name - Possibly nested name of the property to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.IllegalArgumentException - if a nested reference to a property returns null
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getProperty

public static java.lang.String getProperty(java.lang.Object bean,
                                           java.lang.String name)
                                    throws java.lang.IllegalAccessException,
                                           java.lang.reflect.InvocationTargetException,
                                           java.lang.NoSuchMethodException
Return the value of the specified property of the specified bean, no matter which property reference format is used, as a String.

Parameters:
bean - Bean whose property is to be extracted
name - Possibly indexed and/or nested name of the property to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

getSimpleProperty

public static java.lang.String getSimpleProperty(java.lang.Object bean,
                                                 java.lang.String name)
                                          throws java.lang.IllegalAccessException,
                                                 java.lang.reflect.InvocationTargetException,
                                                 java.lang.NoSuchMethodException
Return the value of the specified simple property of the specified bean, converted to a String.

Parameters:
bean - Bean whose property is to be extracted
name - Name of the property to be extracted
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception
java.lang.NoSuchMethodException - if an accessor method for this property cannot be found

populate

public static void populate(java.lang.Object bean,
                            java.util.Map properties)
                     throws java.lang.IllegalAccessException,
                            java.lang.reflect.InvocationTargetException

Populate the JavaBeans properties of the specified bean, based on the specified name/value pairs. This method uses Java reflection APIs to identify corresponding "property setter" method names, and deals with setter arguments of type String, boolean, int, long, float, and double. In addition, array setters for these types (or the corresponding primitive types) can also be identified.

The particular setter method to be called for each property is determined using the usual JavaBeans introspection mechanisms. Thus, you may identify custom setter methods using a BeanInfo class that is associated with the class of the bean itself. If no such BeanInfo class is available, the standard method name conversion ("set" plus the capitalized name of the property in question) is used.

NOTE: It is contrary to the JavaBeans Specification to have more than one setter method (with different argument signatures) for the same property.

WARNING - The logic of this method is customized for extracting String-based request parameters from an HTTP request. It is probably not what you want for general property copying with type conversion. For that purpose, check out the copyProperties() method instead.

Parameters:
bean - JavaBean whose properties are being populated
properties - Map keyed by property name, with the corresponding (String or String[]) value(s) to be set
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception

setProperty

public static void setProperty(java.lang.Object bean,
                               java.lang.String name,
                               java.lang.Object value)
                        throws java.lang.IllegalAccessException,
                               java.lang.reflect.InvocationTargetException

Set the specified property value, performing type conversions as required to conform to the type of the destination property.

If the property is read only then the method returns without throwing an exception.

If null is passed into a property expecting a primitive value, then this will be converted as if it were a null string.

WARNING - The logic of this method is customized to meet the needs of populate(), and is probably not what you want for general property copying with type conversion. For that purpose, check out the copyProperty() method instead.

WARNING - PLEASE do not modify the behavior of this method without consulting with the Struts developer community. There are some subtleties to its functionality that are not documented in the Javadoc description above, yet are vital to the way that Struts utilizes this method.

Parameters:
bean - Bean on which setting is to be performed
name - Property name (can be nested/indexed/mapped/combo)
value - Value to be set
Throws:
java.lang.IllegalAccessException - if the caller does not have access to the property accessor method
java.lang.reflect.InvocationTargetException - if the property accessor method throws an exception


Copyright (c) 2001-2003 - Apache Software Foundation