1.cglibweb
BeanGenerator beanGenerator = new BeanGenerator();apache
beanGenerator.addProperty("id", Long.class);工具
beanGenerator.addProperty("username", String.class);this
Object obj = beanGenerator.create();spa
BeanMap beanMap = BeanMap.create(obj);3d
BeanCopier copier = BeanCopier.create(User.class, obj.getClass(), false);blog
User user = new User();接口
user.setId(1L);ci
user.setUsername("name1");rem
user.setPassword("123");
copier.copy(user, obj, null);
System.out.println(beanMap.get("username"));Class clazz = obj.getClass();
Method[] methods = clazz.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i].getName());
}
輸出結果:
name1
getId
getUsername
setId
setUsername
從輸出結果能夠看出最後生成的obj只有id和username兩個屬性
2.org.apache.commons.beanutils
DynaProperty property = new DynaProperty("id", Long.class);
DynaProperty property1 = new DynaProperty("username", String.class);
BasicDynaClass basicDynaClass = new BasicDynaClass("user", null, newDynaProperty[]{property, property1});
BasicDynaBean basicDynaBean = new BasicDynaBean(basicDynaClass);
User user = new User();
user.setId(1L);
user.setUsername("name1");
user.setPassword("123");
BeanUtils.copyProperties(basicDynaBean, user);Map<String, Object> map = basicDynaBean.getMap();
Iterator<String> it = map.keySet().iterator();while (it.hasNext()) { String key = it.next();
System.out.println(key + ":" + map.get(key));
}
輸入結果:
id:1username:name1
查看BasicDynaBean與BasicDynaClass之間的關係
![JavaBean動態添加刪除屬性](http://static.javashuo.com/static/loading.gif)
DynaBean的源碼
public interface DynaBean {
public boolean contains(String name, String key);
public Object get(String name);
public Object get(String name, int index);
public Object get(String name, String key);
public DynaClass getDynaClass();
public void remove(String name, String key);
public void set(String name, Object value);
public void set(String name, int index, Object value);
public void set(String name, String key, Object value);
}
主要是接口的定義
再來看看BasicDynaBean是怎麼實現的,直接看public Object get(String name);
/**
* Return the value of a simple property with the specified name.
*
* @param name Name of the property whose value is to be retrieved
* @return The property's value
*
* @exception IllegalArgumentException if there is no property
* of the specified name
*/public Object get(String name) { // Return any non-null value for the specified property
Object value = values.get(name); if (value != null) { return (value);
} // Return a null value for a non-primitive property
Class<?> type = getDynaProperty(name).getType(); if (!type.isPrimitive()) { return(value);
} // Manufacture default values for primitive properties
if (type == Boolean.TYPE) { return (Boolean.FALSE);
} else if (type == Byte.TYPE) { return (new Byte((byte) 0));
} else if (type == Character.TYPE) { return (new Character((char) 0));
} else if (type == Double.TYPE) { return (new Double(0.0));
} else if (type == Float.TYPE) { return (new Float((float) 0.0));
} else if (type == Integer.TYPE) { return (new Integer(0));
} else if (type == Long.TYPE) { return (new Long(0));
} else if (type == Short.TYPE) { return (new Short((short) 0));
} else { return (null);
}
}
從以上代碼能夠看出是在values裏取值的
/**
* The set of property values for this DynaBean, keyed by property name.
*/
protected HashMap<String, Object> values = new HashMap<String, Object>();
實際上是用HashMap來實現的.
![JavaBean動態添加刪除屬性](http://static.javashuo.com/static/loading.gif)
3.總結
用cglib動態刪除添加屬性時,雖然obj裏有getUsername這個方法,卻不能obj.getUsername()這樣直接調用,想獲得username的值只能經過beanMap.get("username")獲取.
org.apache.commons.beanutils從源碼來看是使用HashMap來實現的.
兩種方式從操做角度來講和使用Map的區別不大.只是它們都提供了複製屬性的工具方法.