俊星的BLOG

          Commons BeanUtil之我的DynaBean

          下面是關于DynaBean的一個簡單實現:
          1、屬性類:
          package test;

          public class MyDynaProp {
              
          private String name;
              
          private Class<?> type;

              
          public MyDynaProp(String name, Class<?> type) {
                  
          this.name = name;
                  
          this.type = type;
              }

              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }

              
          public Class<?> getType() {
                  
          return type;
              }

              
          public void setType(Class<?> type) {
                  
          this.type = type;
              }
          }

          2、Class接口:
          package test;

          public interface MyDynaClass {
              
          public MyDynaBean newInstance() throws Exception;

              
          public MyDynaProp getDynaProp(String name);

              
          public MyDynaProp[] getProps();
          }


          3、Class接口基本實現類:
          package test;

          import java.lang.reflect.Constructor;
          import java.util.HashMap;
          import java.util.Map;

          public class MyBasicDynaClass implements MyDynaClass {
              
          private String name;
              
          private MyDynaProp[] props =new MyDynaProp[0];
              
          protected Map<String, MyDynaProp> propMap = new HashMap<String, MyDynaProp>();
              
          protected static Class<?>[] constructorTypes = { MyDynaClass.class };
              
          protected Object[] constructorValues = this };
              
          protected Class<?> dynaBeanClass = MyBasicDynaBean.class;

              
          public MyBasicDynaClass(String name, MyDynaProp props[]) {
                  
          this.name = name;
                  
          this.props = props;
                  
          this.propMap.clear();
                  
          for(MyDynaProp prop:props){
                      
          this.propMap.put(prop.getName(), prop);
                  }

              }


              
          public String getName() {
                  
          return name;
              }


              
          public MyDynaProp[] getProps() {
                  
          return props;
              }


              
          public MyDynaBean newInstance() throws Exception {
                  Constructor
          <?> constructor = this.dynaBeanClass.getConstructor(constructorTypes);
                  
          return (MyDynaBean) constructor.newInstance(constructorValues);
              }


              
          public MyDynaProp getDynaProp(String name) {
                  
          return this.propMap.get(name);
              }

          }


          4、Bean接口:
          package test;

          public interface MyDynaBean {
              
          public void set(String name, Object value);
              
          public Object get(String name);
          }


          5、Bean接口實現類:
          package test;

          import java.util.HashMap;
          import java.util.Map;

          public class MyBasicDynaBean implements MyDynaBean {
              
          protected MyDynaClass dynaClass = null;
              
          protected Map<String, Object> values = new HashMap<String, Object>();

              
          public MyBasicDynaBean(MyDynaClass cls) {
                  dynaClass 
          = cls;
              }


              
          public Object get(String name) {
                  
          return this.values.get(name);
              }


              
          public void set(String name, Object value) {
                  MyDynaProp dynaProp 
          = this.dynaClass.getDynaProp(name);
                  
          if (dynaProp == null || !this.isAssignable(dynaProp.getType(), value.getClass())) {
                      
          throw new IllegalArgumentException("IllegalArgumentException");
                  }

                  
          this.values.put(name, value);
              }


              
          /** 驗證是否可賦值 */
              
          protected boolean isAssignable(Class<?> dest, Class<?> source) {
                  
          boolean value = dest.isAssignableFrom(source) || (dest == Integer.TYPE && source == Integer.class)
                          
          || (dest == Boolean.TYPE && source == Boolean.class);
                  
          return value;
              }


              
          public String toString() {
                  MyDynaProp props[] 
          = this.dynaClass.getProps();
                  StringBuffer sbValue 
          = new StringBuffer();
                  
          for (MyDynaProp prop : props) {
                      sbValue.append(prop.getName()).append(
          ":").append(values.get(prop.getName())).append(",");
                  }

                  
          return sbValue.toString();
              }

          }


          6、測試:
          package test;

          import java.util.Date;

          public class Test {
              
          public static void main(String[] args) {
                  MyDynaProp[] props 
          = new MyDynaProp("name", String.class), new MyDynaProp("age", Integer.TYPE),
                          
          new MyDynaProp("date", Date.class), new MyDynaProp("isHero", Boolean.TYPE) }
          ;
                  MyBasicDynaClass cls 
          = new MyBasicDynaClass("user", props);
                  
          try {
                      MyDynaBean bean 
          = cls.newInstance();
                      bean.set(
          "name""SuperStar");
                      bean.set(
          "age"12);
                      bean.set(
          "date"new Date());
                      bean.set(
          "isHero"true);

                      System.out.println(bean);
                  }
           catch (Exception e) {
                      
          // TODO Auto-generated catch block
                      e.printStackTrace();
                  }


              }

          }


          輸出如下:
          name:SuperStar,age:12,date:Mon May 04 21:31:19 CST 2009,isHero:true,

          posted on 2009-05-04 21:35 俊星 閱讀(875) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 兴城市| 麻阳| 屏山县| 温州市| 富裕县| 屏东市| 哈巴河县| 济宁市| 斗六市| 永登县| 上栗县| 余姚市| 呼玛县| 禹州市| 当涂县| 岳阳市| 肇东市| 长汀县| 武安市| 甘德县| 定边县| 昂仁县| 上虞市| 长春市| 阳西县| 闽侯县| 龙里县| 浑源县| 巢湖市| 元谋县| 方城县| 华宁县| 青冈县| 招远市| 德昌县| 甘肃省| 弥渡县| 泸州市| 榆林市| 西乡县| 股票|