動態自定義javabean屬性

梁援—晉 13年前發布 | 5K 次閱讀 云計算 C語言 Evince

在項目過程中遇到這樣一個需求.某個bean的屬性無法提前預知.需要在項目運行的過程中才能確定.剛開始的想法是用反射和代理.但是寫了很長時間沒寫出來.后來在網上搜了搜.有人說用javasist和cglib都能實現.一下是解決方案,拿出來和大家分享.

package com.common; import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import net.sf.cglib.beans.BeanGenerator; import net.sf.cglib.beans.BeanMap; /**

  • @author zyl
  • */
    public class DynamicBean {

    /**

    • 實體Object */
      private Object object = null;

/**

  * 屬??map 
  */  
private  BeanMap beanMap = null;  
/** 
 * 無參構??函數
 */
public DynamicBean() {  
    super();  
}  
/** 
 * 構??函數
 */  
@SuppressWarnings("unchecked")  
public DynamicBean(Map propertyMap) {  
  this.object = generateBean(propertyMap);  
  this.beanMap = BeanMap.create(this.object);  
}  

/** 
  * 給bean屬??賦?? 
  * @param property 屬????
  * @param value ??
  */  
public void setValue(String property, Object value) {  
  beanMap.put(property, value);  
}  

/** 
  * 通過屬??名得到屬性?? 
  * @param property 屬????
  * @return ??
  */  
public Object getValue(String property) {  
  return beanMap.get(property);  
}  

/** 
  * 得到該實體bean對象 
  * @return 
  */  
public Object getObject() {  
  return this.object;  
}  

/** 
 * @param propertyMap 
 * @return 
 */  
@SuppressWarnings("unchecked")  
private Object generateBean(Map propertyMap) {  
  BeanGenerator generator = new BeanGenerator();  
  Set keySet = propertyMap.keySet();  
  for (Iterator i = keySet.iterator(); i.hasNext();) {  
 String key = (String) i.next();  
 generator.addProperty(key, (Class) propertyMap.get(key));  
  }  
  return generator.create();  
}       

}

測試類

package com.common;

import java.lang.reflect.Method; import java.util.HashMap;

public class Test1 { public static void main(String[] args) throws ClassNotFoundException { HashMap propertyMap = new HashMap();
propertyMap.put("id", Class.forName("java.lang.Integer"));
propertyMap.put("name", Class.forName("java.lang.String"));
propertyMap.put("address", Class.forName("java.lang.String")); propertyMap.put("age", Class.forName("java.lang.Integer")); propertyMap.put("a", Class.forName("java.lang.Integer"));

    DynamicBean bean = new DynamicBean(propertyMap);  


    bean.setValue("id", new Integer(123));   
    bean.setValue("name", "454");  
    bean.setValue("address", "789");        
    bean.setValue("age", 123);  
    bean.setValue("a", 1);  




    System.out.println("  >> id      = " + bean.getValue("id"));  
    System.out.println("  >> name    = " + bean.getValue("name"));  
    System.out.println("  >> address = " + bean.getValue("address"));  
    System.out.println("  >> age = " + bean.getValue("age"));  


    Object object = bean.getObject();  


    Class clazz = object.getClass();  
    Method[] methods = clazz.getDeclaredMethods();  
    for (int i = 0; i < methods.length; i++) {  
        System.out.println(methods[i].getName());   
    }  
}  

} 大概就是這樣了.</pre>

 本文由用戶 梁援—晉 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!