You need to expose a bean’s properties
as a Map
, and
operate on the bean properties as if they were entries in a
Map
.
Wrap any bean in a
BeanMap
.
This Map
implementation uses introspection to
provide access to bean properties as if they were key/value pairs in
a map. This code wraps a Person
bean with
BeanMap
, iterating through every key and accessing
bean properties with get( )
:
import java.util.*; import org.apache.commons.collections.BeanMap; Person person = new Person( ); person.setName( "Jim" ); person.setAge( new Integer( 28 ) ); person.setOccupation( "Developer" ); Map beanMap = new BeanMap( person ); Set keys = beanMap.keySet( ); Iterator keyIterator = keys.iterator( ); while( keyIterator.hasNext( ) ) { String propertyName = (String) keyIterator.next( ); System.out.println( "Property: " + propertyName + ", Value: " + beanMap.get( propertyName ) + ", Type: " + beanMap.getType( propertyName ). toString( ) ); }
The Person
bean has the following properties:
age
, name
, and
occupation
; an instance of this bean is created
and passed to the constructor of BeanMap
. The
following output is created by iterating over the key set of
beanMap
:
Property: Age, Value: 28, Type: java.lang.String Property: Name, Value: Jim, Type: java.lang.Integer Property: Occupation, Value: Developer, Type: java.lang.String
The previous example demonstrates the use of
PropertyUtils.describe( )
to create a
Map
containing bean properties.
BeanMap
not only exposes bean properties with a
Map
interface, it wraps a bean instance, allowing
you to alter the contents of the underlying bean via put()
. In addition to implementing the Map
interface, BeanMap
provides a number of additional
methods for obtaining Method
objects and the types
of bean properties. Table 3-1 describes
a
few of these methods.
Table 3-1. Methods provided by BeanMap
Method |
Description |
---|---|
|
Constructs a new instance of a bean using the no-argument constructor
of the class that corresponds to |
|
If possible, creates another instance of |
|
Returns the bean wrapped by this |
|
Causes an instance of |
|
Retrieves the type of the specified bean property |
|
Retrieves a |
|
Retrieves a |
Example 3-6 demonstrates the use of the methods
listed above to manipulate and alter properties of a
Person
bean. Remember, when you alter a
BeanMap
, you are modifying the underlying bean.
Example 3-6. BeanMap methods getBean( ), setBean( ), getType( ), getReadMethod( ), and getWriteMethod( )
package com.discursive.jccook.collections; import java.lang.reflect.Method; import org.apache.commons.collections.BeanMap; public class BeanMapExample { public static void main(String[] args) throws Exception { BeanMapExample example = new BeanMapExample( ); example.start( ); } public void start( ) throws Exception { // Create a Person bean Person person = new Person( ); person.setName( "Todd" ); person.setAge( new Integer( 45 ) ); person.setOccupation( "Record Collector" ); // Wrap person with a Map BeanMap map = new BeanMap( person );// Set the age to 24 using a Method from this map
Method method = map.getWriteMethod( "age" );
method.invoke( person, new Integer(24) );
// Set the name to "John" using map.put
map.put( "name", "John" );
// Create a Person bean Person person2 = new Person( ); person2.setName( "Cindy" ); person2.setAge( new Integer( 39 ) ); person2.setOccupation( "Transcriptionist" );// Make the BeanMap operate on another bean
map.setBean( person2 );
// Get the type of the Age property
Class type = map.getType( "age" );
} }
BeanMap
provides a convenient shortcut for
accessing and manipulating beans, providing the same abilities that
are provided by PropertyUtils
. For more
information about accessing and manipulating
bean properties
with PropertyUtils
, see Recipe 3.8 and Recipe 3.13.
3.142.173.238