org.apache.commons.beanutils

Class WrapDynaClass

Implemented Interfaces:
DynaClass

public class WrapDynaClass
extends java.lang.Object
implements DynaClass

Implementation of DynaClass for DynaBeans that wrap standard JavaBean instances.

It is suggested that this class should not usually need to be used directly to create new WrapDynaBean instances. It's usually better to call the WrapDynaBean constructor directly. For example:

   Object javaBean = ...;
   DynaBean wrapper = new WrapDynaBean(javaBean);
 

Version:
$Revision: 556229 $ $Date: 2007-07-14 07:11:19 +0100 (Sat, 14 Jul 2007) $
Author:
Craig McClanahan

Field Summary

private static ContextClassLoaderLocal
CLASSLOADER_CACHE
protected Class
beanClass
The JavaBean Class which is represented by this WrapDynaClass.
protected PropertyDescriptor[]
descriptors
The set of PropertyDescriptors for this bean class.
protected HashMap
descriptorsMap
The set of PropertyDescriptors for this bean class, keyed by the property name.
protected static HashMap
dynaClasses
Deprecated. The dynaClasses Map will be removed in a subsequent release
protected DynaProperty[]
properties
The set of dynamic properties that are part of this DynaClass.
protected HashMap
propertiesMap
The set of dynamic properties that are part of this DynaClass, keyed by the property name.

Constructor Summary

WrapDynaClass(Class beanClass)
Construct a new WrapDynaClass for the specified JavaBean class.

Method Summary

static void
clear()
Clear our cache of WrapDynaClass instances.
static WrapDynaClass
createDynaClass(Class beanClass)
Create (if necessary) and return a new WrapDynaClass instance for the specified bean class.
private static Map
getDynaClassesMap()
Get the wrap dyna classes cache
DynaProperty[]
getDynaProperties()
Return an array of ProperyDescriptors for the properties currently defined in this DynaClass.
DynaProperty
getDynaProperty(String name)
Return a property descriptor for the specified property, if it exists; otherwise, return null.
String
getName()
Return the name of this DynaClass (analogous to the getName() method of java.lang.ClassDynaClass implementation class to support different dynamic classes, with different sets of properties.
PropertyDescriptor
getPropertyDescriptor(String name)
Return the PropertyDescriptor for the specified property name, if any; otherwise return null.
protected void
introspect()
Introspect our bean class to identify the supported properties.
DynaBean
newInstance()
Instantiates a new standard JavaBean instance associated with this DynaClass and return it wrapped in a new WrapDynaBean instance.

Field Details

CLASSLOADER_CACHE

private static final ContextClassLoaderLocal CLASSLOADER_CACHE

beanClass

protected Class beanClass
The JavaBean Class which is represented by this WrapDynaClass.

descriptors

protected PropertyDescriptor[] descriptors
The set of PropertyDescriptors for this bean class.

descriptorsMap

protected HashMap descriptorsMap
The set of PropertyDescriptors for this bean class, keyed by the property name. Individual descriptor instances will be the same instances as those in the descriptors list.

dynaClasses

protected static HashMap dynaClasses

Deprecated. The dynaClasses Map will be removed in a subsequent release

The set of WrapDynaClass instances that have ever been created, keyed by the underlying bean Class. The keys to this map are Class objects, and the values are corresponding WrapDynaClass objects.

This static variable is safe even when this code is deployed via a shared classloader because it is keyed via a Class object. The same class loaded via two different classloaders will result in different entries in this map.

Note, however, that this HashMap can result in a memory leak. When this class is in a shared classloader it will retain references to classes loaded via a webapp classloader even after the webapp has been undeployed. That will prevent the entire classloader and all the classes it refers to and all their static members from being freed. !!!!!!!!!!!! PLEASE NOTE !!!!!!!!!!!! ************* THE FOLLOWING IS A NASTY HACK TO SO THAT BEANUTILS REMAINS BINARY COMPATIBLE WITH PREVIOUS RELEASES. There are two issues here: 1) Memory Issues: The static HashMap caused memory problems (See BEANUTILS-59) to resolve this it has been moved into a ContextClassLoaderLocal instance (named CLASSLOADER_CACHE above) which holds one copy per ClassLoader in a WeakHashMap. 2) Binary Compatibility: As the "dynaClasses" static HashMap is "protected" removing it breaks BeanUtils binary compatibility with previous versions. To resolve this all the methods have been overriden to delegate to the Map for the ClassLoader in the ContextClassLoaderLocal.


properties

protected DynaProperty[] properties
The set of dynamic properties that are part of this DynaClass.

propertiesMap

protected HashMap propertiesMap
The set of dynamic properties that are part of this DynaClass, keyed by the property name. Individual descriptor instances will be the same instances as those in the properties list.

Constructor Details

WrapDynaClass

private WrapDynaClass(Class beanClass)
Construct a new WrapDynaClass for the specified JavaBean class. This constructor is private; WrapDynaClass instances will be created as needed via calls to the createDynaClass(Class) method.
Parameters:
beanClass - JavaBean class to be introspected around

Method Details

clear

public static void clear()
Clear our cache of WrapDynaClass instances.

createDynaClass

public static WrapDynaClass createDynaClass(Class beanClass)
Create (if necessary) and return a new WrapDynaClass instance for the specified bean class.
Parameters:
beanClass - Bean class for which a WrapDynaClass is requested
Returns:
A new Wrap DynaClass

getDynaClassesMap

private static Map getDynaClassesMap()
Get the wrap dyna classes cache

getDynaProperties

public DynaProperty[] getDynaProperties()
Return an array of ProperyDescriptors for the properties currently defined in this DynaClass. If no properties are defined, a zero-length array will be returned.

FIXME - Should we really be implementing getBeanInfo() instead, which returns property descriptors and a bunch of other stuff?

Specified by:
getDynaProperties in interface DynaClass
Returns:
the set of properties for this DynaClass

getDynaProperty

public DynaProperty getDynaProperty(String name)
Return a property descriptor for the specified property, if it exists; otherwise, return null.
Specified by:
getDynaProperty in interface DynaClass
Parameters:
name - Name of the dynamic property for which a descriptor is requested
Returns:
The descriptor for the specified property

getName

public String getName()
Return the name of this DynaClass (analogous to the getName() method of java.lang.ClassDynaClass implementation class to support different dynamic classes, with different sets of properties.
Specified by:
getName in interface DynaClass
Returns:
the name of the DynaClass

getPropertyDescriptor

public PropertyDescriptor getPropertyDescriptor(String name)
Return the PropertyDescriptor for the specified property name, if any; otherwise return null.
Parameters:
name - Name of the property to be retrieved
Returns:
The descriptor for the specified property

introspect

protected void introspect()
Introspect our bean class to identify the supported properties.

newInstance

public DynaBean newInstance()
            throws IllegalAccessException,
                   InstantiationException
Instantiates a new standard JavaBean instance associated with this DynaClass and return it wrapped in a new WrapDynaBean instance. NOTE the JavaBean should have a no argument constructor. NOTE - Most common use cases should not need to use this method. It is usually better to create new WrapDynaBean instances by calling its constructor. For example:
   Object javaBean = ...;
   DynaBean wrapper = new WrapDynaBean(javaBean);
 

(This method is needed for some kinds of DynaBean framework.)

Specified by:
newInstance in interface DynaClass
Returns:
A new DynaBean instance

Copyright (c) 2001-2007 - Apache Software Foundation