groovy优势:自定义动态Bean

来源:互联网 发布:慢慢买数据怎么看 编辑:程序博客网 时间:2024/05/21 07:54

开发mongodb,json很方便,但有时又需要bean,为了不固定属性,需要动态的生成bean。下面两种方式都可以实现,供参考。

groovy自定义bean

Groovy中Expando类是一种动态Bean。我们可以Expando类的实例增加属性和闭包,当我们对一个简单的bean不想为其创建一个类,是非常有用的。

def user = new Expando(username: 'mrhaki')assert 'mrhaki' == user.username// Add an extra property.user.email = 'email@host.com'assert 'email@host.com' == user.email// Assign closure as method. The closure can// take parameters.user.printInfo = { writer ->    writer << "Username: $username"    writer << ", email: $email"}def sw = new StringWriter()user.printInfo(sw)assert 'Username: mrhaki, email: email@host.com' == sw.toString()

java利用cglib实现自定义bean

Java中要实现,利用cglib也可以实现:

public class CglibBean {      /**       * 实体Object       */      public Object object = null;      /**       * 属性map       */      public BeanMap beanMap = null;      public CglibBean() {        super();      }      @SuppressWarnings("unchecked")      public CglibBean(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;      }      @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();      }      }  

测试CglibBean

import java.lang.reflect.Method;  import java.util.HashMap;  /**  * Cglib测试类  * @author cuiran  * @version 1.0  */  public class CglibTest {      @SuppressWarnings("unchecked")      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"));          // 生成动态 Bean          CglibBean bean = new CglibBean(propertyMap);          // 给 Bean 设置值          bean.setValue("id", new Integer(123));          bean.setValue("name", "454");          bean.setValue("address", "789");          // 从 Bean 中获取值,当然了获得值的类型是 Object          System.out.println("  >> id      = " + bean.getValue("id"));          System.out.println("  >> name    = " + bean.getValue("name"));          System.out.println("  >> address = " + bean.getValue("address"));          // 获得bean的实体          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());        }  
1 0
原创粉丝点击