java動態給實體類添加屬性


 


需要的jar包有兩個: cglib-3.1.jar 和 google-collections-1.0.jar 
如果是maven項目,就不需要cglib-3.1.jar,直接用spring自帶的 org.springframework.cglib即可。 
1、創建一個實體:DynamicBean

 

public class DynamicBean { private Object target; private BeanMap beanMap; public DynamicBean(Class superclass, Map<String, Class> propertyMap) { this.target = generateBean(superclass, propertyMap); this.beanMap = BeanMap.create(this.target); } public void setValue(String property, Object value) { beanMap.put(property, value); } public Object getValue(String property) { return beanMap.get(property); } public Object getTarget() { return this.target; } /** * 根據屬性生成對象 * */ private Object generateBean(Class superclass, Map<String, Class> propertyMap) { BeanGenerator generator = new BeanGenerator(); if (null != superclass) { generator.setSuperclass(superclass); } BeanGenerator.addProperties(generator, propertyMap); return generator.create(); } } 

 

2、創建映射類,用來生成動態bean

public class ReflectUtil { private static Logger logger = LoggerFactory.getLogger(ReflectUtil.class); public static Object getObject(Object dest, Map<String, Object> addProperties) { PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean(); PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest); Map<String, Class> propertyMap = Maps.newHashMap(); for (PropertyDescriptor d : descriptors) { if (!"class".equalsIgnoreCase(d.getName())) { propertyMap.put(d.getName(), d.getPropertyType()); } } addProperties.forEach((k, v) -> { String sclass = v.getClass().toString(); if(sclass.equals("class java.util.Date")) {//對日期進行處理 propertyMap.put(k, Long.class); }else { propertyMap.put(k, v.getClass()); } }); DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap); propertyMap.forEach((k, v) -> { try { if (!addProperties.containsKey(k)) { dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k)); } } catch (Exception e) { logger.error("動態添加字段出錯", e); } }); addProperties.forEach((k, v) -> { try { String sclass = v.getClass().toString(); if(sclass.equals("class java.util.Date")) {//動態添加的字段為date類型需要進行處理 Date date = (Date) v; dynamicBean.setValue(k, date.getTime()); }else { dynamicBean.setValue(k, v); } } catch (Exception e) { logger.error("動態添加字段值出錯", e); } }); Object obj = dynamicBean.getTarget(); return obj; } } 

 

3、使用方法
現有一個用戶實體User:

public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 

 

User只有一個name屬性,現在要動態的為User添加年齡屬性,代碼如下:

public static void main(String[] args) { User user = new User(); user.setName("Daisy"); System.out.println("User:"+JSON.toJSONString(user)); Map<String,Object> propertiesMap = new HashMap<String,Object>(); propertiesMap.put("age", 18); Object obj = ReflectUtil.getTarget(user, propertiesMap); System.out.println("動態為User添加age之后,User:"+JSON.toJSONString(obj)); }
 

打印結果如下:

User:{"name":"Daisy"} 動態為User添加age之后,User:{"age":18,"name":"Daisy"}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM