动态生成java类,来自bao110908大神

Cglib 中有个 BeanGenerator 就是专门用于做这个的,可以动态生成 JavaBean,
BeanGenerator 利用了非常底层的 ASM 字节码框架来实现的。
  1. import java.lang.reflect.Field;  
  2. import java.lang.reflect.Method;  
  3. import java.util.HashMap;  
  4. import java.util.Iterator;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7.   
  8. import net.sf.cglib.beans.BeanGenerator;  
  9. import net.sf.cglib.beans.BeanMap;  
  10.   
  11. public class DynaBeanCglibTest {  
  12.   
  13.     public static void main(String[] args) throws ClassNotFoundException {  
  14.           
  15.         System.out.println("Generate JavaBean ...");          
  16.         // 设置类成员属性  
  17.         Map properties = new HashMap();  
  18.         properties.put("id", Class.forName("java.lang.Integer"));  
  19.         properties.put("name", Class.forName("java.lang.String"));  
  20.         properties.put("address", Class.forName("java.lang.String"));  
  21.         // 生成动态 Bean  
  22.         CglibDynaBean bean = new CglibDynaBean(properties);  
  23.         System.out.println("  OK!");  
  24.           
  25.         System.out.println("Set values ...");  
  26.         // 给 Bean 设置值  
  27.         bean.setValue("id"new Integer(123));  
  28.         bean.setValue("name""454");  
  29.         bean.setValue("address""789");  
  30.         System.out.println("  OK!");  
  31.           
  32.         System.out.println("Get values");  
  33.         // 从 Bean 中获取值,当然了获得值的类型是 Object  
  34.         System.out.println("  >> id      = " + bean.getValue("id"));  
  35.         System.out.println("  >> name    = " + bean.getValue("name"));  
  36.         System.out.println("  >> address = " + bean.getValue("address"));  
  37.   
  38.         System.out.println("Class name");  
  39.         // 查看动态 Bean 的类名  
  40.         Class clazz = bean.getObject().getClass();  
  41.         System.out.println("  >> " + clazz.getName());  
  42.           
  43.         System.out.println("Show all methods");  
  44.         // 查看动态 Bean 中声明的方法  
  45.         Method[] methods = clazz.getDeclaredMethods();  
  46.         for(int i = 0; i < methods.length; i++) {  
  47.             System.out.println("  >> " + methods[i].getName());  
  48.         }  
  49.   
  50.         System.out.println("Show all properties");  
  51.         // 查看动态 Bean 中声明的字段  
  52.         Field[] fields = clazz.getDeclaredFields();  
  53.         for(int i = 0; i < fields.length; i++) {  
  54.             System.out.println("  >> " + fields[i].getName());  
  55.         }   
  56.     }  
  57. }  
  58.   
  59. class CglibDynaBean {  
  60.     private Object object = null;  
  61.     private BeanMap beanMap = null;  
  62.       
  63.     public CglibDynaBean(Map properties) {          
  64.         this.object = generateBean(properties);  
  65.         this.beanMap = getBeanMap();  
  66.     }  
  67.       
  68.     public void setValue(String property, Object value) {  
  69.         beanMap.put(property, value);  
  70.     }  
  71.       
  72.     public Object getValue(String property) {  
  73.         return beanMap.get(property);  
  74.     }  
  75.   
  76.     public Object getObject() {  
  77.         return this.object;  
  78.     }    
  79.      
  80.     private Object generateBean(Map properties) {  
  81.         BeanGenerator generator = new BeanGenerator();  
  82.         Set keySet = properties.keySet();  
  83.         for(Iterator i = keySet.iterator(); i.hasNext();) {  
  84.             String key = (String)i.next();  
  85.             generator.addProperty(key, (Class)properties.get(key));  
  86.         }  
  87.         return generator.create();  
  88.     }  
  89.       
  90.     private BeanMap getBeanMap() {  
  91.         return BeanMap.create(this.object);  
  92.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值