1 package common;
 2 /* 
 3  * Created on 2007-8-21
 4  */
 5 
 6 import java.beans.BeanInfo;
 7 import java.beans.Introspector;
 8 import java.beans.PropertyDescriptor;
 9 
10 import com.ebuilds.pmzls.project.dto.TCmBaseDicttypeDto;
11 import com.ebuilds.pmzls.project.ejb.cmp.TCmBaseDicttype;
12 /**
13  * 利用jdk 内省机制,将dto转换未cmp
14  * 当前只支持3个类型
15  * dto to cmp
16  * @author liuyang
17  */
18 public class Convert {
19     public static void convertpojo(Object obj,Object objto,String noconvertcol) throws Exception
20     {
21 //        得到obj对象
22         BeanInfo bi = Introspector.getBeanInfo(obj.getClass(),Object.class );
23 //        得到objto对象
24         BeanInfo bi1 = Introspector.getBeanInfo(objto.getClass(),Object.class );
25 //        取出obj中所有具有get和set方法的变量名
26         PropertyDescriptor[] props = bi.getPropertyDescriptors();
27 //        取出objto中所有具有get和set方法的变量名
28         PropertyDescriptor[] props1 = bi1.getPropertyDescriptors();
29 //        按变量名进行索引
30         for ( int i=0;i<props.length;i++){
31 //            排序对比相同则转换
32             for(int j=0;j<props1.length;j++)
33             {
34 //                是否是不需要转换字段
35                 boolean bf = true;
36 //                取出obj中该变量所对应的值
37                 Object oth = props[i].getReadMethod().invoke(obj,null);
38 //                如果是不需要转换变量则不进行取值
39                 for(String name:noconvertcol)
40                 {
41                     if(name.equals(props[i].getName()))
42                     {
43                         bf=false;
44                         break;
45                     }
46                 }
47 //                判断是否是相同类型,相同名称,并且是需要转换的变量
48                 if(props[i].getName().equals(props1[j].getName()) && props[i].getPropertyType().equals(props1[j].getPropertyType()) && bf)
49                 {
50 //                    判断变量类型,将空转换为0或者“”
51                     if(props[i].getPropertyType().equals(java.lang.Long.class))
52                     {
53                         props1[j].getWriteMethod().invoke(objto,(oth==null?Long.valueOf(0):oth));    
54                     }else if(props[i].getPropertyType().equals(java.lang.String.class)){
55                         props1[j].getWriteMethod().invoke(objto,(oth==null?"":oth));
56                     }else if(props[i].getPropertyType().equals(java.lang.Integer.class))
57                     {
58                         props1[j].getWriteMethod().invoke(objto,(oth==null?0:oth));
59                     }
60                 }
61             }
62         }
63 //        for ( int i=0;i<props1.length;i++){
64 //            System.out.println(props1[i].getName()+ "=" +
65 //                    props1[i].getReadMethod().invoke(objto, null ));
66 //        }
67     }
68     
69     
70     
71     public static void main(String[] args) throws Exception{
72         // 如果不想把父类的属性也列出来的话,
73         // 那 getBeanInfo 的第二个参数填写父类的信息
74         TCmBaseDicttypeDto dto = new TCmBaseDicttypeDto();
75         dto.setCode("00001");
76         dto.setName("00002");
77         TCmBaseDicttype td = new  TCmBaseDicttype();
78         convertpojo(dto, td);
79     }    
80     
81        
82 }
83 
最近刚刚看了一些关于内省的文章正好开发项目中要使用,所以自己写了一个转换器,供大家一起学习
TCmBaseDicttypeDto、TCmBaseDicttype只是一个set和get集合

我的文章大家看了都没给回复,大哥们给点人气。