Commons BeanUtil之我的DynaBean

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 ,

你可能感兴趣的:(Commons BeanUtil之我的DynaBean)