使用cglib动态创建java类

转至: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.         }  
原文地址:https://www.cnblogs.com/zxf330301/p/5798241.html