java实现相同属性名称及相似类型的pojo、dto、vo等互转操作
已应用于实际项目:
1.thrift对象与dto之间的互转
2.pojo与dto之间的互转
3.pojo与vo之间的互转
1.核心转换工具类,对特别复杂类型不做处理,因为业务场景还未覆盖
packagelittlehow.convert; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importjava.lang.reflect.Field; importjava.lang.reflect.Method; importjava.lang.reflect.ParameterizedType; importjava.lang.reflect.Type; importjava.math.BigDecimal; importjava.sql.Timestamp; importjava.util.*; importjava.util.concurrent.ConcurrentHashMap; /** *PojoConvertUtil * *@authorlittlehow *@time2017-05-0316:54 */ publicclassPojoConvertUtil{ privatestaticLoggerlogger=LoggerFactory.getLogger(PojoConvertUtil.class); /** *变量缓存 */ privatestaticfinalMap>cacheFields=newConcurrentHashMap<>(); privatestaticfinalSet basicClass=newHashSet<>(); static{ basicClass.add(Integer.class); basicClass.add(Character.class); basicClass.add(Byte.class); basicClass.add(Float.class); basicClass.add(Double.class); basicClass.add(Boolean.class); basicClass.add(Long.class); basicClass.add(Short.class); basicClass.add(String.class); basicClass.add(BigDecimal.class); } /** *将具有相同属性的类型进行转换 *@paramorig *@param *@return */ publicstatic TconvertPojo(Objectorig,Class targetClass){ try{ Ttarget=targetClass.newInstance(); /**获取源对象的所有变量*/ Field[]fields=orig.getClass().getDeclaredFields(); for(Fieldfield:fields){ if(isStatic(field))continue; /**获取目标方法*/ FieldtargetField=getTargetField(targetClass,field.getName()); if(targetField==null)continue; Objectvalue=getFiledValue(field,orig); if(value==null)continue; Classtype1=field.getType(); Classtype2=targetField.getType(); //两个类型是否相同 booleansameType=type1.equals(type2); if(isBasicType(type1)){ if(sameType)setFieldValue(targetField,target,value); }elseif(valueinstanceofMap&&Map.class.isAssignableFrom(type2)){//对map setMap((Map)value,field,targetField,target); }elseif(valueinstanceofSet&&Set.class.isAssignableFrom(type2)){//对set setCollection((Collection)value,field,targetField,target); }elseif(valueinstanceofList&&List.class.isAssignableFrom(type2)){//对list setCollection((Collection)value,field,targetField,target); }elseif(valueinstanceofEnum&&Enum.class.isAssignableFrom(type2)){//对enum setEnum((Enum)value,field,targetField,target); }elseif(valueinstanceofjava.util.Date&& java.util.Date.class.isAssignableFrom(type2)){//对日期类型,不处理如joda包之类的扩展时间,不处理calendar setDate((Date)value,targetField,type2,target,sameType); } } returntarget; }catch(Throwablet){ logger.error("转换失败:"+t.getMessage()); thrownewRuntimeException(t.getMessage()); } } /** *获取字段值 *@paramfield *@paramobj *@return */ privatestaticObjectgetFiledValue(Fieldfield,Objectobj)throwsIllegalAccessException{ //获取原有的访问权限 booleanaccess=field.isAccessible(); try{ //设置可访问的权限 field.setAccessible(true); returnfield.get(obj); }finally{ //恢复访问权限 field.setAccessible(access); } } /** *设置方法值 *@paramfield *@paramobj *@paramvalue *@throwsIllegalAccessException */ privatestaticvoidsetFieldValue(Fieldfield,Objectobj,Objectvalue)throwsIllegalAccessException{ //获取原有的访问权限 booleanaccess=field.isAccessible(); try{ //设置可访问的权限 field.setAccessible(true); field.set(obj,value); }finally{ //恢复访问权限 field.setAccessible(access); } } /** *转换list *@paramorig *@paramtargetClass *@param *@return */ publicstatic List convertPojos(Listorig,Class targetClass){ List list=newArrayList<>(orig.size()); for(Objectobject:orig){ list.add(convertPojo(object,targetClass)); } returnlist; } /** *设置Map *@paramvalue *@paramorigField *@paramtargetField *@paramtargetObject *@param */ privatestatic voidsetMap(Mapvalue,FieldorigField,FieldtargetField,TtargetObject)throwsIllegalAccessException,InstantiationException{ TypeorigType=origField.getGenericType(); TypetargetType=targetField.getGenericType(); if(origTypeinstanceofParameterizedType&&targetTypeinstanceofParameterizedType){//泛型类型 ParameterizedTypeorigParameterizedType=(ParameterizedType)origType; Type[]origTypes=origParameterizedType.getActualTypeArguments(); ParameterizedTypetargetParameterizedType=(ParameterizedType)targetType; Type[]targetTypes=targetParameterizedType.getActualTypeArguments(); if(origTypes!=null&&origTypes.length==2&&targetTypes!=null&&targetTypes.length==2){//正常泛型,查看第二个泛型是否不为基本类型 Classclazz=(Class)origTypes[1]; if(!isBasicType(clazz)&&!clazz.equals(targetTypes[1])){//如果不是基本类型并且泛型不一致,则需要继续转换 Set entries=value.entrySet(); MaptargetMap=value.getClass().newInstance(); for(Map.Entryentry:entries){ targetMap.put(entry.getKey(),convertPojo(entry.getValue(),(Class)targetTypes[1])); } setFieldValue(targetField,targetObject,targetMap); return; } } } setFieldValue(targetField,targetObject,value); } /** *设置集合 *@paramvalue *@paramorigField *@paramtargetField *@paramtargetObject *@param *@throwsIllegalAccessException *@throwsInstantiationException */ privatestatic voidsetCollection(Collectionvalue,FieldorigField,FieldtargetField,TtargetObject)throwsIllegalAccessException,InstantiationException{ TypeorigType=origField.getGenericType(); TypetargetType=targetField.getGenericType(); if(origTypeinstanceofParameterizedType&&targetTypeinstanceofParameterizedType){//泛型类型 ParameterizedTypeorigParameterizedType=(ParameterizedType)origType; Type[]origTypes=origParameterizedType.getActualTypeArguments(); ParameterizedTypetargetParameterizedType=(ParameterizedType)targetType; Type[]targetTypes=targetParameterizedType.getActualTypeArguments(); if(origTypes!=null&&origTypes.length==1&&targetTypes!=null&&targetTypes.length==1){//正常泛型,查看第二个泛型是否不为基本类型 Classclazz=(Class)origTypes[0]; if(!isBasicType(clazz)&&!clazz.equals(targetTypes[0])){//如果不是基本类型并且泛型不一致,则需要继续转换 Collectioncollection=value.getClass().newInstance(); for(Objectobj:value){ collection.add(convertPojo(obj,(Class)targetTypes[0])); } setFieldValue(targetField,targetObject,collection); return; } } } setFieldValue(targetField,targetObject,value); } /** *设置枚举类型 *@paramvalue *@paramorigField *@paramtargetField *@paramtargetObject *@param */ privatestatic voidsetEnum(Enumvalue,FieldorigField,FieldtargetField,TtargetObject)throwsException{ if(origField.equals(targetField)){ setFieldValue(targetField,targetObject,value); }else{ //枚举类型都具有一个static修饰的valueOf方法 Methodmethod=targetField.getType().getMethod("valueOf",String.class); setFieldValue(targetField,targetObject,method.invoke(null,value.toString())); } } /** *设置日期类型 *@paramvalue *@paramtargetField *@paramtargetFieldType *@paramtargetObject *@param */ privatestatic voidsetDate(Datevalue,FieldtargetField,ClasstargetFieldType,TtargetObject,booleansameType)throwsIllegalAccessException{ Datedate=null; if(sameType){ date=value; }elseif(targetFieldType.equals(java.sql.Date.class)){ date=newjava.sql.Date(value.getTime()); }elseif(targetFieldType.equals(java.util.Date.class)){ date=newDate(value.getTime()); }elseif(targetFieldType.equals(java.sql.Timestamp.class)){ date=newjava.sql.Timestamp(value.getTime()); } setFieldValue(targetField,targetObject,date); } /** *获取适配方法 *@paramclazz *@paramfieldName *@return */ publicstaticFieldgetTargetField(Classclazz,StringfieldName){ StringclassKey=clazz.getName(); Map fieldMap=cacheFields.get(classKey); if(fieldMap==null){ fieldMap=newHashMap<>(); Field[]fields=clazz.getDeclaredFields(); for(Fieldfield:fields){ if(isStatic(field))continue; fieldMap.put(field.getName(),field); } cacheFields.put(classKey,fieldMap); } returnfieldMap.get(fieldName); } /** *确实是否为基础类型 *@paramclazz *@return */ publicstaticbooleanisBasicType(Classclazz){ returnclazz.isPrimitive()||basicClass.contains(clazz); } /** *判断变量是否有静态修饰符static *@paramfield *@return */ publicstaticbooleanisStatic(Fieldfield){ return(8&field.getModifiers())==8; } }
下面这个类是便于输出展示的,因为只是用于打印,所以不做效率考虑
packagelittlehow.convert; importjava.lang.reflect.Field; importjava.text.DateFormat; importjava.text.SimpleDateFormat; importjava.util.Date; /** *SimpleToStringParent * *@authorlittlehow *@time2017-05-0410:40 */ publicclassSimpleToStringParent{ @Override publicStringtoString(){ try{ StringBuilderstringBuilder=newStringBuilder("{"); Field[]fields=this.getClass().getDeclaredFields(); DateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); for(Fieldfield:fields){ Objectvalue=getFiledValue(field,this); if(value==null)continue; if(valueinstanceofDate){ //这里也可以直接转为时间戳 value=dateFormat.format((Date)value); } stringBuilder.append(field.getName()).append("=").append(value).append(","); } StringreturnValue=stringBuilder.toString(); if(returnValue.length()>1){ returnValue=returnValue.substring(0,returnValue.length()-1); } returnthis.getClass().getSimpleName()+returnValue+"}"; }catch(Exceptione){ //skip } returnthis.getClass().getSimpleName()+"{}"; } /** *获取属性值 *@paramfield *@paramobj *@return *@throwsIllegalAccessException */ privateObjectgetFiledValue(Fieldfield,Objectobj)throwsIllegalAccessException{ //获取原有的访问权限 booleanaccess=field.isAccessible(); try{ //设置可访问的权限 field.setAccessible(true); returnfield.get(obj); }finally{ //恢复访问权限 field.setAccessible(access); } } }
测试用的4个pojo
1.产品类
packagelittlehow.convert.pojo; importlittlehow.convert.SimpleToStringParent; importjava.util.List; /** *Product * *@authorlittlehow *@time2017-05-0409:15 */ publicclassProductextendsSimpleToStringParent{ privateIntegerproductId; privateStringgeneralName; privateStringfactoryName; privateStringunit; privateStringspecification; privateIntegercategory; privateList- items; publicIntegergetProductId(){ returnproductId; } publicvoidsetProductId(IntegerproductId){ this.productId=productId; } publicStringgetGeneralName(){ returngeneralName; } publicvoidsetGeneralName(StringgeneralName){ this.generalName=generalName; } publicStringgetFactoryName(){ returnfactoryName; } publicvoidsetFactoryName(StringfactoryName){ this.factoryName=factoryName; } publicStringgetUnit(){ returnunit; } publicvoidsetUnit(Stringunit){ this.unit=unit; } publicStringgetSpecification(){ returnspecification; } publicvoidsetSpecification(Stringspecification){ this.specification=specification; } publicList
- getItems(){ returnitems; } publicvoidsetItems(List
- items){ this.items=items; } publicIntegergetCategory(){ returncategory; } publicvoidsetCategory(Integercategory){ this.category=category; } }
2.商品类
packagelittlehow.convert.pojo; importlittlehow.convert.SimpleToStringParent; importjava.util.Date; importjava.util.List; /** *Item * *@authorlittlehow *@time2017-05-0409:15 */ publicclassItemextendsSimpleToStringParent{ privateLongitemId; privateStringitemName; privateBytestatus; privateBooleandeleted; privateDatecreateTime; privateListskus; publicLonggetItemId(){ returnitemId; } publicvoidsetItemId(LongitemId){ this.itemId=itemId; } publicStringgetItemName(){ returnitemName; } publicvoidsetItemName(StringitemName){ this.itemName=itemName; } publicBytegetStatus(){ returnstatus; } publicvoidsetStatus(Bytestatus){ this.status=status; } publicBooleangetDeleted(){ returndeleted; } publicvoidsetDeleted(Booleandeleted){ this.deleted=deleted; } publicDategetCreateTime(){ returncreateTime; } publicvoidsetCreateTime(DatecreateTime){ this.createTime=createTime; } publicList getSkus(){ returnskus; } publicvoidsetSkus(List skus){ this.skus=skus; } }
3.最小库存单位sku
packagelittlehow.convert.pojo; importlittlehow.convert.SimpleToStringParent; importjava.lang.reflect.Field; /** *Sku * *@authorlittlehow *@time2017-05-0409:15 */ publicclassSkuextendsSimpleToStringParent{ privateLongskuId; privateBytestatus; privateBooleandeleted; privateDoubleprice; privateDoublepromoPrice; privateIntegerinventory; privateIntegerminBuy; privateIntegerblockInventory; privateColorskuColor; publicLonggetSkuId(){ returnskuId; } publicvoidsetSkuId(LongskuId){ this.skuId=skuId; } publicBytegetStatus(){ returnstatus; } publicvoidsetStatus(Bytestatus){ this.status=status; } publicBooleangetDeleted(){ returndeleted; } publicvoidsetDeleted(Booleandeleted){ this.deleted=deleted; } publicDoublegetPrice(){ returnprice; } publicvoidsetPrice(Doubleprice){ this.price=price; } publicDoublegetPromoPrice(){ returnpromoPrice; } publicvoidsetPromoPrice(DoublepromoPrice){ this.promoPrice=promoPrice; } publicIntegergetInventory(){ returninventory; } publicvoidsetInventory(Integerinventory){ this.inventory=inventory; } publicIntegergetMinBuy(){ returnminBuy; } publicvoidsetMinBuy(IntegerminBuy){ this.minBuy=minBuy; } publicIntegergetBlockInventory(){ returnblockInventory; } publicvoidsetBlockInventory(IntegerblockInventory){ this.blockInventory=blockInventory; } publicColorgetSkuColor(){ returnskuColor; } publicvoidsetSkuColor(ColorskuColor){ this.skuColor=skuColor; } }
4.属性枚举
packagelittlehow.convert.pojo; /** *Color * *@authorlittlehow *@time2017-05-0409:21 */ publicenumColor{ BLACK(1), RED(2), BLUE(3), GREEN(4); publicfinalintvalue; Color(intvalue){ this.value=value; } publicstaticColorvalueOf(intvalue){ switch(value){ case1:returnBLACK; case2:returnRED; case3:returnBLUE; case4:returnGREEN; default:thrownewIllegalArgumentException(value+"isnotaenumvalue"); } } }
转换用的dto,当然也可以将dto作为转换源
1.产品dto
packagelittlehow.convert.dto; importlittlehow.convert.SimpleToStringParent; importlittlehow.convert.pojo.Item; importjava.util.List; /** *ProductDto * *@authorlittlehow *@time2017-05-0409:16 */ publicclassProductDtoextendsSimpleToStringParent{ privateIntegerproductId; privateStringgeneralName; privateStringfactoryName; privateStringunit; privateStringspecification; privateIntegercategory; privateListitems; publicIntegergetProductId(){ returnproductId; } publicvoidsetProductId(IntegerproductId){ this.productId=productId; } publicStringgetGeneralName(){ returngeneralName; } publicvoidsetGeneralName(StringgeneralName){ this.generalName=generalName; } publicStringgetFactoryName(){ returnfactoryName; } publicvoidsetFactoryName(StringfactoryName){ this.factoryName=factoryName; } publicStringgetUnit(){ returnunit; } publicvoidsetUnit(Stringunit){ this.unit=unit; } publicStringgetSpecification(){ returnspecification; } publicvoidsetSpecification(Stringspecification){ this.specification=specification; } publicList getItems(){ returnitems; } publicvoidsetItems(List items){ this.items=items; } publicIntegergetCategory(){ returncategory; } publicvoidsetCategory(Integercategory){ this.category=category; } }
2.商品dto
packagelittlehow.convert.dto; importlittlehow.convert.SimpleToStringParent; importlittlehow.convert.pojo.Sku; importjava.util.Date; importjava.util.List; /** *ItemDto * *@authorlittlehow *@time2017-05-0409:16 */ publicclassItemDtoextendsSimpleToStringParent{ privateIntegeritemId; privateStringitemName; privateBytestatus; privateBooleandeleted; privateDatecreateTime; privateListskus; publicIntegergetItemId(){ returnitemId; } publicvoidsetItemId(IntegeritemId){ this.itemId=itemId; } publicStringgetItemName(){ returnitemName; } publicvoidsetItemName(StringitemName){ this.itemName=itemName; } publicBytegetStatus(){ returnstatus; } publicvoidsetStatus(Bytestatus){ this.status=status; } publicBooleangetDeleted(){ returndeleted; } publicvoidsetDeleted(Booleandeleted){ this.deleted=deleted; } publicDategetCreateTime(){ returncreateTime; } publicvoidsetCreateTime(DatecreateTime){ this.createTime=createTime; } publicList getSkus(){ returnskus; } publicvoidsetSkus(List skus){ this.skus=skus; } }
3.skudto
packagelittlehow.convert.dto; importlittlehow.convert.SimpleToStringParent; importlittlehow.convert.pojo.Color; /** *SkuDto * *@authorlittlehow *@time2017-05-0409:16 */ publicclassSkuDtoextendsSimpleToStringParent{ privateLongskuId; privateBytestatus; privateBooleandeleted; privateDoubleprice; privateDoublepromoPrice; privateIntegerinventory; privateIntegerminBuy; privateIntegerblockInventory; privateColorDtoskuColor; publicLonggetSkuId(){ returnskuId; } publicvoidsetSkuId(LongskuId){ this.skuId=skuId; } publicBytegetStatus(){ returnstatus; } publicvoidsetStatus(Bytestatus){ this.status=status; } publicBooleangetDeleted(){ returndeleted; } publicvoidsetDeleted(Booleandeleted){ this.deleted=deleted; } publicDoublegetPrice(){ returnprice; } publicvoidsetPrice(Doubleprice){ this.price=price; } publicDoublegetPromoPrice(){ returnpromoPrice; } publicvoidsetPromoPrice(DoublepromoPrice){ this.promoPrice=promoPrice; } publicIntegergetInventory(){ returninventory; } publicvoidsetInventory(Integerinventory){ this.inventory=inventory; } publicIntegergetMinBuy(){ returnminBuy; } publicvoidsetMinBuy(IntegerminBuy){ this.minBuy=minBuy; } publicIntegergetBlockInventory(){ returnblockInventory; } publicvoidsetBlockInventory(IntegerblockInventory){ this.blockInventory=blockInventory; } publicColorDtogetSkuColor(){ returnskuColor; } publicvoidsetSkuColor(ColorDtoskuColor){ this.skuColor=skuColor; } }
4.颜色属性
packagelittlehow.convert.dto; /** *ColorDto * *@authorlittlehow *@time2017-05-0409:21 */ publicenumColorDto{ BLACK(1), RED(2), BLUE(3), GREEN(4); publicfinalintvalue; ColorDto(intvalue){ this.value=value; } publicstaticColorDtovalueOf(intvalue){ switch(value){ case1:returnBLACK; case2:returnRED; case3:returnBLUE; case4:returnGREEN; default:thrownewIllegalArgumentException(value+"isnotaenumvalue"); } } }
测试类,简单的做了一下输出查看
packagelittlehow.convert.test; importlittlehow.convert.PojoConvertUtil; importlittlehow.convert.dto.ItemDto; importlittlehow.convert.dto.ProductDto; importlittlehow.convert.dto.SkuDto; importlittlehow.convert.pojo.Color; importlittlehow.convert.pojo.Item; importlittlehow.convert.pojo.Product; importlittlehow.convert.pojo.Sku; importorg.junit.Before; importorg.junit.Test; importjava.util.ArrayList; importjava.util.Date; importjava.util.List; /** *TransTest * *@authorlittlehow *@time2017-05-0410:44 */ publicclassTransTest{ privateProductproduct; @Before publicvoidinit(){ product=newProduct(); product.setCategory(123); product.setFactoryName("littlehow'sshop"); product.setGeneralName("littlehow'sproduct"); product.setProductId(1); product.setSpecification("16*2u"); product.setUnit("box"); List- items=newArrayList<>(); for(inti=1;i<=5;i++){ Itemitem=newItem(); item.setCreateTime(newDate()); item.setDeleted(i%3==0); item.setItemId((long)i); item.setItemName("littlehow's"+i+"thitem"); item.setStatus((byte)(i%4)); List
skus=newArrayList<>(); for(intj=1;j<=i;j++){ Skusku=newSku(); sku.setSkuId((long)(j*(i+5)*3)); sku.setStatus((byte)1); sku.setDeleted(false); sku.setBlockInventory(5); sku.setInventory(j*100); sku.setMinBuy(j*5); sku.setPrice(Double.valueOf(j*103)); sku.setPromoPrice(Double.valueOf(j*101)); sku.setSkuColor(Color.valueOf(j%4+1)); skus.add(sku); } item.setSkus(skus); items.add(item); } product.setItems(items); } @Test publicvoidtest(){ System.out.println(product);//正常输出 System.out.println("========================"); ProductDtoproductDto=PojoConvertUtil.convertPojo(product,ProductDto.class); System.out.println(productDto);//正常输出,证明转换正常 System.out.println("========================="); List - items=product.getItems(); List
itemDtos=PojoConvertUtil.convertPojos(items,ItemDto.class); System.out.println(itemDtos);//正常输出,数组转换成功 } @Test publicvoidtest1(){ Skusku=product.getItems().get(0).getSkus().get(0); System.out.println(sku);//正常输出 System.out.println("========================="); SkuDtoskuDto=PojoConvertUtil.convertPojo(sku,SkuDto.class); System.out.println(skuDto); } }
能快速完成基础类之间的互转
以上这篇java实现相同属性名称及相似类型的pojo、dto、vo等互转操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。