BeanMap这个Map类用于把一个javaBean转换为Map,在其中存储了javaBean的各个属性的setXXX方法和getXXX方法,属性的类型。
public class BeanMap extends AbstractMap implements Cloneable
{
private transient Object bean;//javaBean对象
private transient HashMap readMethods = new HashMap();//getXXX方法集
private transient HashMap writeMethods = new HashMap();//setXXX方法集
private transient HashMap types = new HashMap();//成员变量类型集
public static final Object[] NULL_ARGUMENTS = {};//空参数集,用于通过reflection调用getXXX方法
public static HashMap defaultTransformers = new HashMap();//把基本类型映射为transformer类型,后者用于将字符串转换为合适的基本型的包装类
//默认transformer
static
{
defaultTransformers.put( Boolean.TYPE, new Transformer()
{
public Object transform( Object input )
{
return Boolean.valueOf( input.toString() );
}
}
);
defaultTransformers.put( Character.TYPE, new Transformer()
{
public Object transform( Object input )
{
return new Character( input.toString().charAt( 0 ) );
}
}
);
defaultTransformers.put( Byte.TYPE, new Transformer()
{
public Object transform( Object input )
{
return Byte.valueOf( input.toString() );
}
}
);
defaultTransformers.put( Short.TYPE, new Transformer()
{
public Object transform( Object input )
{
return Short.valueOf( input.toString() );
}
}
);
defaultTransformers.put(
Integer.TYPE,
new Transformer() {
public Object transform( Object input ) {
return Integer.valueOf( input.toString() );
}
}
);
defaultTransformers.put( Long.TYPE, new Transformer()
{
public Object transform( Object input ) {
return Long.valueOf( input.toString() );
}
}
);
defaultTransformers.put( Float.TYPE, new Transformer()
{
public Object transform( Object input ) {
return Float.valueOf( input.toString() );
}
}
);
defaultTransformers.put( Double.TYPE, new Transformer()
{
public Object transform( Object input ) {
return Double.valueOf( input.toString() );
}
}
);
}
public BeanMap(Object bean) {
this.bean = bean;
initialise();
}
public Object clone() throws CloneNotSupportedException {
BeanMap newMap = (BeanMap)super.clone();
if(bean == null) {//若底层bean不存在,则返回一个复制的空BeanMap,
return newMap;
}
Object newBean = null;
Class beanClass = null;
try {
beanClass = bean.getClass();//底层bean的Class
newBean = beanClass.newInstance();//实例化一个新的bean
} catch (Exception e) {
// unable to instantiate
throw new CloneNotSupportedException
("Unable to instantiate the underlying bean "" +
beanClass.getName() + "": " + e);
}
try {
newMap.setBean(newBean);
} catch (Exception exception) {
throw new CloneNotSupportedException
("Unable to set bean in the cloned bean map: " +
exception);
}
try {
//复制所有可读写的属性
Iterator readableKeys = readMethods.keySet().iterator();
while(readableKeys.hasNext()) {
Object key = readableKeys.next();//属性名称
if(getWriteMethod(key) != null) {
newMap.put(key, get(key));//放入到新BeanMap中
}
}
} catch (Exception exception) {
throw new CloneNotSupportedException
("Unable to copy bean values to cloned bean map: " +
exception);
}
return newMap;
}
public void clear() {
if(bean == null) return;
Class beanClass = null;
try {
beanClass = bean.getClass();
bean = beanClass.newInstance();//重新实例化,一切都回到默认状态
}
catch (Exception e) {
throw new UnsupportedOperationException( "Could not create new instance of class: " + beanClass );
}
}
责任编辑:小草