使用cglib動態建立java類

隨風而逝,只是飄零發表於2016-08-23

轉至:http://ckwang17.iteye.com/blog/963881

cglib

是一個開源專案!

是一個強大的,高效能,高質量的Code生成類庫,它可以在執行期擴充套件Java類與實現Java介面。許多開源專案都用到了它,如Hibernate,Spring之類用它來實現動態代理。

 簡單樣例—動態生成bean

  樣例說明:建立一個動態實體bean,使用cglib動態加入屬性,和相應的get,set方法。

需要匯入cglib-nodep-2.2.jar

been類

 

 

Java程式碼  
  1. <strong>public class CglibBean {  
  2. /** 
  3.   * 實體Object 
  4.   */  
  5. public Object object = null;  
  6.   
  7. /** 
  8.   * 屬性map 
  9.   */  
  10. public BeanMap beanMap = null;  
  11.   
  12. public CglibBean() {  
  13.   super();  
  14. }  
  15.   
  16. @SuppressWarnings("unchecked")  
  17. public CglibBean(Map propertyMap) {  
  18.   this.object = generateBean(propertyMap);  
  19.   this.beanMap = BeanMap.create(this.object);  
  20. }  
  21.   
  22. /** 
  23.   * 給bean屬性賦值 
  24.   * @param property 屬性名 
  25.   * @param value 值 
  26.   */  
  27. public void setValue(String property, Object value) {  
  28.   beanMap.put(property, value);  
  29. }  
  30.   
  31. /** 
  32.   * 通過屬性名得到屬性值 
  33.   * @param property 屬性名 
  34.   * @return 值 
  35.   */  
  36. public Object getValue(String property) {  
  37.   return beanMap.get(property);  
  38. }  
  39.   
  40. /** 
  41.   * 得到該實體bean物件 
  42.   * @return 
  43.   */  
  44. public Object getObject() {  
  45.   return this.object;  
  46. }  
  47.   
  48. @SuppressWarnings("unchecked")  
  49. private Object generateBean(Map propertyMap) {  
  50.   BeanGenerator generator = new BeanGenerator();  
  51.   Set keySet = propertyMap.keySet();  
  52.   for (Iterator i = keySet.iterator(); i.hasNext();) {  
  53.    String key = (String) i.next();  
  54.    generator.addProperty(key, (Class) propertyMap.get(key));  
  55.   }  
  56.   return generator.create();  
  57. }  
  58. }  
  59. </strong>  

 

 

 

 

 

 

再寫一個測試類

Java程式碼  
  1. package com.infotech.cglibTest;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import java.util.HashMap;  
  5.   
  6. /** 
  7.  * Cglib測試類 
  8.  * @author cuiran 
  9.  * @version 1.0 
  10.  */  
  11. public class CglibTest {  
  12.       
  13.       
  14.       
  15.     @SuppressWarnings("unchecked")  
  16.     public static void main(String[] args) throws ClassNotFoundException {  
  17.   
  18.         // 設定類成員屬性  
  19.         HashMap propertyMap = new HashMap();  
  20.   
  21.         propertyMap.put("id", Class.forName("java.lang.Integer"));  
  22.   
  23.         propertyMap.put("name", Class.forName("java.lang.String"));  
  24.   
  25.         propertyMap.put("address", Class.forName("java.lang.String"));  
  26.   
  27.         // 生成動態 Bean  
  28.         CglibBean bean = new CglibBean(propertyMap);  
  29.   
  30.         // 給 Bean 設定值  
  31.         bean.setValue("id", new Integer(123));  
  32.   
  33.         bean.setValue("name", "454");  
  34.   
  35.         bean.setValue("address", "789");  
  36.   
  37.         // 從 Bean 中獲取值,當然了獲得值的型別是 Object  
  38.   
  39.         System.out.println("  >> id      = " + bean.getValue("id"));  
  40.   
  41.         System.out.println("  >> name    = " + bean.getValue("name"));  
  42.   
  43.         System.out.println("  >> address = " + bean.getValue("address"));  
  44.   
  45.         // 獲得bean的實體  
  46.         Object object = bean.getObject();  
  47.   
  48.         // 通過反射檢視所有方法名  
  49.         Class clazz = object.getClass();  
  50.         Method[] methods = clazz.getDeclaredMethods();  
  51.         for (int i = 0; i < methods.length; i++) {  
  52.             System.out.println(methods[i].getName());
  53.         }  

相關文章