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<>();
privatestaticfinalSetbasicClass=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
*/
publicstaticTconvertPojo(Objectorig,ClasstargetClass){
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
*/
publicstaticListconvertPojos(Listorig,ClasstargetClass){
Listlist=newArrayList<>(orig.size());
for(Objectobject:orig){
list.add(convertPojo(object,targetClass));
}
returnlist;
}
/**
*设置Map
*@paramvalue
*@paramorigField
*@paramtargetField
*@paramtargetObject
*@param
*/
privatestaticvoidsetMap(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])){//如果不是基本类型并且泛型不一致,则需要继续转换
Setentries=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
*/
privatestaticvoidsetCollection(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
*/
privatestaticvoidsetEnum(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
*/
privatestaticvoidsetDate(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();
MapfieldMap=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;
}
publicListgetSkus(){
returnskus;
}
publicvoidsetSkus(Listskus){
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;
}
publicListgetItems(){
returnitems;
}
publicvoidsetItems(Listitems){
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;
}
publicListgetSkus(){
returnskus;
}
publicvoidsetSkus(Listskus){
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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。