日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java實現相同屬性名稱及相似類型的pojo、dto、vo等互轉操作

瀏覽:159日期:2022-08-26 14:41:34

已應用于實際項目:

1.thrift對象與dto之間的互轉

2.pojo與dto之間的互轉

3.pojo與vo之間的互轉

1.核心轉換工具類,對特別復雜類型不做處理,因為業務場景還未覆蓋

package littlehow.convert; import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.math.BigDecimal;import java.sql.Timestamp;import java.util.*;import java.util.concurrent.ConcurrentHashMap; /** * PojoConvertUtil * * @author littlehow * @time 2017-05-03 16:54 */public class PojoConvertUtil { private static Logger logger = LoggerFactory.getLogger(PojoConvertUtil.class); /** * 變量緩存 */ private static final Map<String, Map<String, Field>> cacheFields = new ConcurrentHashMap<>(); private static final Set<Class> basicClass = new HashSet<>(); 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); } /** * 將具有相同屬性的類型進行轉換 * @param orig * @param <T> * @return */ public static <T> T convertPojo(Object orig, Class<T> targetClass) { try { T target = targetClass.newInstance(); /** 獲取源對象的所有變量 */ Field[] fields = orig.getClass().getDeclaredFields(); for (Field field : fields) {if (isStatic(field)) continue;/** 獲取目標方法 */Field targetField = getTargetField(targetClass, field.getName());if (targetField == null) continue;Object value = getFiledValue(field, orig);if (value == null) continue;Class type1 = field.getType();Class type2 = targetField.getType();//兩個類型是否相同boolean sameType = type1.equals(type2);if (isBasicType(type1)) { if (sameType) setFieldValue(targetField, target, value);} else if (value instanceof Map && Map.class.isAssignableFrom(type2)){//對map setMap((Map)value, field, targetField, target);} else if (value instanceof Set && Set.class.isAssignableFrom(type2)) {//對set setCollection((Collection)value, field, targetField, target);} else if (value instanceof List && List.class.isAssignableFrom(type2)) {//對list setCollection((Collection)value, field, targetField, target);} else if (value instanceof Enum && Enum.class.isAssignableFrom(type2)) {//對enum setEnum((Enum)value, field, targetField, target);} else if (value instanceof java.util.Date && java.util.Date.class.isAssignableFrom(type2)) {//對日期類型,不處理如joda包之類的擴展時間,不處理calendar setDate((Date)value, targetField, type2, target, sameType);} } return target; } catch (Throwable t) { logger.error('轉換失敗:' + t.getMessage()); throw new RuntimeException(t.getMessage()); } } /** * 獲取字段值 * @param field * @param obj * @return */ private static Object getFiledValue(Field field, Object obj) throws IllegalAccessException { //獲取原有的訪問權限 boolean access = field.isAccessible(); try { //設置可訪問的權限 field.setAccessible(true); return field.get(obj); } finally { //恢復訪問權限 field.setAccessible(access); } } /** * 設置方法值 * @param field * @param obj * @param value * @throws IllegalAccessException */ private static void setFieldValue(Field field, Object obj, Object value) throws IllegalAccessException { //獲取原有的訪問權限 boolean access = field.isAccessible(); try { //設置可訪問的權限 field.setAccessible(true); field.set(obj, value); } finally { //恢復訪問權限 field.setAccessible(access); } } /** * 轉換list * @param orig * @param targetClass * @param <T> * @return */ public static <T> List<T> convertPojos(List orig, Class<T> targetClass) { List<T> list = new ArrayList<>(orig.size()); for (Object object : orig) { list.add(convertPojo(object, targetClass)); } return list; } /** * 設置Map * @param value * @param origField * @param targetField * @param targetObject * @param <T> */ private static <T> void setMap(Map value, Field origField, Field targetField, T targetObject) throws IllegalAccessException, InstantiationException{ Type origType = origField.getGenericType(); Type targetType = targetField.getGenericType(); if (origType instanceof ParameterizedType && targetType instanceof ParameterizedType) {//泛型類型 ParameterizedType origParameterizedType = (ParameterizedType)origType; Type[] origTypes = origParameterizedType.getActualTypeArguments(); ParameterizedType targetParameterizedType = (ParameterizedType)targetType; Type[] targetTypes = targetParameterizedType.getActualTypeArguments(); if (origTypes != null && origTypes.length == 2 && targetTypes != null && targetTypes.length == 2) {//正常泛型,查看第二個泛型是否不為基本類型Class clazz = (Class)origTypes[1];if (!isBasicType(clazz) && !clazz.equals(targetTypes[1])) {//如果不是基本類型并且泛型不一致,則需要繼續轉換 Set<Map.Entry> entries = value.entrySet(); Map targetMap = value.getClass().newInstance(); for (Map.Entry entry : entries) { targetMap.put(entry.getKey(), convertPojo(entry.getValue(), (Class) targetTypes[1])); } setFieldValue(targetField, targetObject, targetMap); return;} } } setFieldValue(targetField, targetObject, value); } /** * 設置集合 * @param value * @param origField * @param targetField * @param targetObject * @param <T> * @throws IllegalAccessException * @throws InstantiationException */ private static <T> void setCollection(Collection value, Field origField, Field targetField, T targetObject) throws IllegalAccessException, InstantiationException{ Type origType = origField.getGenericType(); Type targetType = targetField.getGenericType(); if (origType instanceof ParameterizedType && targetType instanceof ParameterizedType) {//泛型類型 ParameterizedType origParameterizedType = (ParameterizedType)origType; Type[] origTypes = origParameterizedType.getActualTypeArguments(); ParameterizedType targetParameterizedType = (ParameterizedType)targetType; Type[] targetTypes = targetParameterizedType.getActualTypeArguments(); if (origTypes != null && origTypes.length == 1 && targetTypes != null && targetTypes.length == 1) {//正常泛型,查看第二個泛型是否不為基本類型Class clazz = (Class)origTypes[0];if (!isBasicType(clazz) && !clazz.equals(targetTypes[0])) {//如果不是基本類型并且泛型不一致,則需要繼續轉換 Collection collection = value.getClass().newInstance(); for (Object obj : value) { collection.add(convertPojo(obj, (Class) targetTypes[0])); } setFieldValue(targetField, targetObject, collection); return;} } } setFieldValue(targetField, targetObject, value); } /** * 設置枚舉類型 * @param value * @param origField * @param targetField * @param targetObject * @param <T> */ private static <T> void setEnum(Enum value, Field origField, Field targetField, T targetObject) throws Exception{ if (origField.equals(targetField)) { setFieldValue(targetField, targetObject, value); } else { //枚舉類型都具有一個static修飾的valueOf方法 Method method = targetField.getType().getMethod('valueOf', String.class); setFieldValue(targetField, targetObject, method.invoke(null, value.toString())); } } /** * 設置日期類型 * @param value * @param targetField * @param targetFieldType * @param targetObject * @param <T> */ private static <T> void setDate(Date value, Field targetField, Class targetFieldType, T targetObject, boolean sameType) throws IllegalAccessException { Date date = null; if (sameType) { date = value; } else if (targetFieldType.equals(java.sql.Date.class)) { date = new java.sql.Date(value.getTime()); } else if (targetFieldType.equals(java.util.Date.class)) { date = new Date(value.getTime()); } else if (targetFieldType.equals(java.sql.Timestamp.class)) { date = new java.sql.Timestamp(value.getTime()); } setFieldValue(targetField, targetObject, date); } /** * 獲取適配方法 * @param clazz * @param fieldName * @return */ public static Field getTargetField(Class clazz, String fieldName) { String classKey = clazz.getName(); Map<String, Field> fieldMap = cacheFields.get(classKey); if (fieldMap == null) { fieldMap = new HashMap<>(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) {if (isStatic(field)) continue;fieldMap.put(field.getName(), field); } cacheFields.put(classKey, fieldMap); } return fieldMap.get(fieldName); } /** * 確實是否為基礎類型 * @param clazz * @return */ public static boolean isBasicType(Class clazz) { return clazz.isPrimitive() || basicClass.contains(clazz); } /** * 判斷變量是否有靜態修飾符static * @param field * @return */ public static boolean isStatic(Field field) { return (8 & field.getModifiers()) == 8; }}

下面這個類是便于輸出展示的,因為只是用于打印,所以不做效率考慮

package littlehow.convert; import java.lang.reflect.Field;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date; /** * SimpleToStringParent * * @author littlehow * @time 2017-05-04 10:40 */public class SimpleToStringParent { @Override public String toString() { try { StringBuilder stringBuilder = new StringBuilder('{'); Field[] fields = this.getClass().getDeclaredFields(); DateFormat dateFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss'); for (Field field : fields) {Object value = getFiledValue(field, this);if (value == null) continue;if (value instanceof Date) { //這里也可以直接轉為時間戳 value = dateFormat.format((Date)value);}stringBuilder.append(field.getName()).append('=').append(value).append(','); } String returnValue = stringBuilder.toString(); if (returnValue.length() > 1) {returnValue = returnValue.substring(0, returnValue.length() - 1); } return this.getClass().getSimpleName() + returnValue + '}'; } catch (Exception e) { // skip } return this.getClass().getSimpleName() + '{}'; } /** * 獲取屬性值 * @param field * @param obj * @return * @throws IllegalAccessException */ private Object getFiledValue(Field field, Object obj) throws IllegalAccessException { //獲取原有的訪問權限 boolean access = field.isAccessible(); try { //設置可訪問的權限 field.setAccessible(true); return field.get(obj); } finally { //恢復訪問權限 field.setAccessible(access); } }}

測試用的4個pojo

1.產品類

package littlehow.convert.pojo; import littlehow.convert.SimpleToStringParent; import java.util.List; /** * Product * * @author littlehow * @time 2017-05-04 09:15 */public class Product extends SimpleToStringParent { private Integer productId; private String generalName; private String factoryName; private String unit; private String specification; private Integer category; private List<Item> items; public Integer getProductId() { return productId; } public void setProductId(Integer productId) { this.productId = productId; } public String getGeneralName() { return generalName; } public void setGeneralName(String generalName) { this.generalName = generalName; } public String getFactoryName() { return factoryName; } public void setFactoryName(String factoryName) { this.factoryName = factoryName; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification; } public List<Item> getItems() { return items; } public void setItems(List<Item> items) { this.items = items; } public Integer getCategory() { return category; } public void setCategory(Integer category) { this.category = category; }}

2.商品類

package littlehow.convert.pojo; import littlehow.convert.SimpleToStringParent; import java.util.Date;import java.util.List; /** * Item * * @author littlehow * @time 2017-05-04 09:15 */public class Item extends SimpleToStringParent { private Long itemId; private String itemName; private Byte status; private Boolean deleted; private Date createTime; private List<Sku> skus; public Long getItemId() { return itemId; } public void setItemId(Long itemId) { this.itemId = itemId; } public String getItemName() { return itemName; } public void setItemName(String itemName) { this.itemName = itemName; } public Byte getStatus() { return status; } public void setStatus(Byte status) { this.status = status; } public Boolean getDeleted() { return deleted; } public void setDeleted(Boolean deleted) { this.deleted = deleted; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public List<Sku> getSkus() { return skus; } public void setSkus(List<Sku> skus) { this.skus = skus; }}

3.最小庫存單位sku

package littlehow.convert.pojo; import littlehow.convert.SimpleToStringParent; import java.lang.reflect.Field; /** * Sku * * @author littlehow * @time 2017-05-04 09:15 */public class Sku extends SimpleToStringParent { private Long skuId; private Byte status; private Boolean deleted; private Double price; private Double promoPrice; private Integer inventory; private Integer minBuy; private Integer blockInventory; private Color skuColor; public Long getSkuId() { return skuId; } public void setSkuId(Long skuId) { this.skuId = skuId; } public Byte getStatus() { return status; } public void setStatus(Byte status) { this.status = status; } public Boolean getDeleted() { return deleted; } public void setDeleted(Boolean deleted) { this.deleted = deleted; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public Double getPromoPrice() { return promoPrice; } public void setPromoPrice(Double promoPrice) { this.promoPrice = promoPrice; } public Integer getInventory() { return inventory; } public void setInventory(Integer inventory) { this.inventory = inventory; } public Integer getMinBuy() { return minBuy; } public void setMinBuy(Integer minBuy) { this.minBuy = minBuy; } public Integer getBlockInventory() { return blockInventory; } public void setBlockInventory(Integer blockInventory) { this.blockInventory = blockInventory; } public Color getSkuColor() { return skuColor; } public void setSkuColor(Color skuColor) { this.skuColor = skuColor; }}

4.屬性枚舉

package littlehow.convert.pojo; /** * Color * * @author littlehow * @time 2017-05-04 09:21 */public enum Color { BLACK(1), RED(2), BLUE(3), GREEN(4); public final int value; Color(int value) { this.value = value; } public static Color valueOf(int value) { switch (value) { case 1 : return BLACK; case 2 : return RED; case 3 : return BLUE; case 4 : return GREEN; default : throw new IllegalArgumentException(value + ' is not a enum value'); } }}

轉換用的dto,當然也可以將dto作為轉換源

1.產品dto

package littlehow.convert.dto; import littlehow.convert.SimpleToStringParent;import littlehow.convert.pojo.Item; import java.util.List; /** * ProductDto * * @author littlehow * @time 2017-05-04 09:16 */public class ProductDto extends SimpleToStringParent { private Integer productId; private String generalName; private String factoryName; private String unit; private String specification; private Integer category; private List<ItemDto> items; public Integer getProductId() { return productId; } public void setProductId(Integer productId) { this.productId = productId; } public String getGeneralName() { return generalName; } public void setGeneralName(String generalName) { this.generalName = generalName; } public String getFactoryName() { return factoryName; } public void setFactoryName(String factoryName) { this.factoryName = factoryName; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification; } public List<ItemDto> getItems() { return items; } public void setItems(List<ItemDto> items) { this.items = items; } public Integer getCategory() { return category; } public void setCategory(Integer category) { this.category = category; }}

2.商品dto

package littlehow.convert.dto; import littlehow.convert.SimpleToStringParent;import littlehow.convert.pojo.Sku; import java.util.Date;import java.util.List; /** * ItemDto * * @author littlehow * @time 2017-05-04 09:16 */public class ItemDto extends SimpleToStringParent { private Integer itemId; private String itemName; private Byte status; private Boolean deleted; private Date createTime; private List<SkuDto> skus; public Integer getItemId() { return itemId; } public void setItemId(Integer itemId) { this.itemId = itemId; } public String getItemName() { return itemName; } public void setItemName(String itemName) { this.itemName = itemName; } public Byte getStatus() { return status; } public void setStatus(Byte status) { this.status = status; } public Boolean getDeleted() { return deleted; } public void setDeleted(Boolean deleted) { this.deleted = deleted; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public List<SkuDto> getSkus() { return skus; } public void setSkus(List<SkuDto> skus) { this.skus = skus; }}

3.skudto

package littlehow.convert.dto; import littlehow.convert.SimpleToStringParent;import littlehow.convert.pojo.Color; /** * SkuDto * * @author littlehow * @time 2017-05-04 09:16 */public class SkuDto extends SimpleToStringParent { private Long skuId; private Byte status; private Boolean deleted; private Double price; private Double promoPrice; private Integer inventory; private Integer minBuy; private Integer blockInventory; private ColorDto skuColor; public Long getSkuId() { return skuId; } public void setSkuId(Long skuId) { this.skuId = skuId; } public Byte getStatus() { return status; } public void setStatus(Byte status) { this.status = status; } public Boolean getDeleted() { return deleted; } public void setDeleted(Boolean deleted) { this.deleted = deleted; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public Double getPromoPrice() { return promoPrice; } public void setPromoPrice(Double promoPrice) { this.promoPrice = promoPrice; } public Integer getInventory() { return inventory; } public void setInventory(Integer inventory) { this.inventory = inventory; } public Integer getMinBuy() { return minBuy; } public void setMinBuy(Integer minBuy) { this.minBuy = minBuy; } public Integer getBlockInventory() { return blockInventory; } public void setBlockInventory(Integer blockInventory) { this.blockInventory = blockInventory; } public ColorDto getSkuColor() { return skuColor; } public void setSkuColor(ColorDto skuColor) { this.skuColor = skuColor; }}

4.顏色屬性

package littlehow.convert.dto; /** * ColorDto * * @author littlehow * @time 2017-05-04 09:21 */public enum ColorDto { BLACK(1), RED(2), BLUE(3), GREEN(4); public final int value; ColorDto(int value) { this.value = value; } public static ColorDto valueOf(int value) { switch (value) { case 1 : return BLACK; case 2 : return RED; case 3 : return BLUE; case 4 : return GREEN; default : throw new IllegalArgumentException(value + ' is not a enum value'); } }}

測試類,簡單的做了一下輸出查看

package littlehow.convert.test; import littlehow.convert.PojoConvertUtil;import littlehow.convert.dto.ItemDto;import littlehow.convert.dto.ProductDto;import littlehow.convert.dto.SkuDto;import littlehow.convert.pojo.Color;import littlehow.convert.pojo.Item;import littlehow.convert.pojo.Product;import littlehow.convert.pojo.Sku;import org.junit.Before;import org.junit.Test; import java.util.ArrayList;import java.util.Date;import java.util.List; /** * TransTest * * @author littlehow * @time 2017-05-04 10:44 */public class TransTest { private Product product; @Before public void init() { product = new Product(); product.setCategory(123); product.setFactoryName('littlehow’s shop'); product.setGeneralName('littlehow’s product'); product.setProductId(1); product.setSpecification('16*2u'); product.setUnit('box'); List<Item> items = new ArrayList<>(); for (int i=1; i<=5; i++) { Item item = new Item(); item.setCreateTime(new Date()); item.setDeleted(i % 3 == 0); item.setItemId((long) i); item.setItemName('littlehow’s ' + i + 'th item'); item.setStatus((byte) (i % 4)); List<Sku> skus = new ArrayList<>(); for (int j=1; j<=i; j++) {Sku sku = new Sku();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 public void test() { System.out.println(product);//正常輸出 System.out.println('========================'); ProductDto productDto = PojoConvertUtil.convertPojo(product, ProductDto.class); System.out.println(productDto);//正常輸出,證明轉換正常 System.out.println('========================='); List<Item> items = product.getItems(); List<ItemDto> itemDtos = PojoConvertUtil.convertPojos(items, ItemDto.class); System.out.println(itemDtos);//正常輸出,數組轉換成功 } @Test public void test1() { Sku sku = product.getItems().get(0).getSkus().get(0); System.out.println(sku);//正常輸出 System.out.println('========================='); SkuDto skuDto = PojoConvertUtil.convertPojo(sku, SkuDto.class); System.out.println(skuDto); }}

能快速完成基礎類之間的互轉

以上這篇java實現相同屬性名稱及相似類型的pojo、dto、vo等互轉操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品成人| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲一二三区视频| 六月天综合网| 视频一区欧美精品| 亚洲毛片在线| 三级欧美韩日大片在线看| 免费欧美在线视频| 日本国产欧美| 国产精品毛片aⅴ一区二区三区| 国产伦理一区| 色婷婷综合网| 伊人精品一区| 六月天综合网| 欧美视频久久| 日韩成人精品一区| 蜜桃成人av| 四虎精品永久免费| 国产精品毛片视频| 国产精品精品国产一区二区| 日韩欧美看国产| 成人精品中文字幕| 在线视频精品| 亚洲精品人人| 国产精品主播| 日韩不卡免费高清视频| 夜夜嗨一区二区| 国产区精品区| 色综合www| 视频一区免费在线观看| 国产精品网在线观看| 精品国产欧美| 欧美日韩激情在线一区二区三区| 伊人精品久久| 精品国产网站| 亚洲深夜福利| 婷婷视频一区二区三区| 精品国产乱码久久久| 激情五月色综合国产精品| 日韩欧美精品一区二区综合视频| 精品国产亚洲一区二区三区| 欧美特黄一区| 国产精品一区二区精品视频观看| а√天堂中文在线资源8| 国产一区导航| 欧美精品不卡| 2023国产精品久久久精品双 | 精品国产亚洲一区二区三区在线 | 国产资源在线观看入口av| 亚洲免费成人| 国产精品极品在线观看| 999国产精品999久久久久久| 视频一区日韩精品| 中文字幕成在线观看| 香蕉久久国产| 精品免费在线| 亚欧洲精品视频在线观看| 成人日韩精品| 日本va欧美va精品发布| 日韩欧美另类一区二区| 欧美日韩亚洲三区| 久久久水蜜桃av免费网站| 青青草精品视频| 欧美精品一区二区久久| 久久丁香四色| 日本欧洲一区二区| 日韩欧美午夜| 国产欧美日韩精品一区二区三区| 九一成人免费视频| 91偷拍一区二区三区精品| 中文字幕日本一区二区| 欧美三级精品| 国产欧美日韩精品一区二区免费| 精品1区2区3区4区| 最新中文字幕在线播放| 18国产精品| 欧美日韩视频| 日韩影院二区| 久久av日韩| 日韩一区精品| 99在线|亚洲一区二区| 成人福利av| 欧美精品成人| 欧美日韩亚洲一区| 亚洲午夜久久| 亚洲精品中文字幕乱码| 国产美女高潮在线| 你懂的亚洲视频| 青青青国产精品| 免费观看在线综合色| 欧美一区二区性| 欧美激情另类| 国产成人免费精品| 久久福利在线| 国产精品**亚洲精品| 奇米亚洲欧美| 香蕉久久久久久| 亚洲天堂日韩在线| 久久国产成人| 在线视频日韩| 1000部精品久久久久久久久| 天堂中文av在线资源库| 精品精品99| 国产一区调教| 精品伊人久久| 国产精品色在线网站| 中文在线日韩| 亚洲精选av| 日韩综合一区二区| 亚洲综合图色| 男女性色大片免费观看一区二区| 91超碰国产精品| 欧美搞黄网站| 欧美在线资源| 国产偷自视频区视频一区二区| 午夜国产一区二区| 99在线精品视频在线观看| 在线综合视频| 三级欧美在线一区| 综合一区av| 日韩极品在线观看| 中文字幕亚洲精品乱码| 亚洲3区在线| 日本成人中文字幕| 日韩国产在线观看一区| 日产欧产美韩系列久久99| 亚久久调教视频| 久久激情av| 精品免费视频| 日韩免费福利视频| 99精品在线观看| 免费欧美一区| 亚洲专区欧美专区| 中文字幕免费一区二区| 欧美日韩亚洲一区三区| 久久久久亚洲精品中文字幕| 精品一区电影| 国产麻豆久久| 鲁大师影院一区二区三区| 五月激激激综合网色播| 国产精品v亚洲精品v日韩精品| 久久精品五月| 亚洲福利国产| 蜜臀久久99精品久久久画质超高清 | 精品中文字幕一区二区三区av| 欧美日韩四区| 天堂av一区| 丁香婷婷久久| 九九久久电影| 日韩有吗在线观看| 国产精品porn| 日韩欧美网址| 免费在线成人网| 国产精品99精品一区二区三区∴ | 国产精品15p| 日韩毛片视频| 久热精品在线| 国产精品视频一区二区三区四蜜臂| 福利一区二区免费视频| 国产精品av久久久久久麻豆网| 三级欧美在线一区| 国产精品久久久免费| 深夜福利视频一区二区| 在线视频精品| 国产精品巨作av| 欧美va亚洲va日韩∨a综合色| 免费观看在线综合色| 久久精品天堂| 在线视频观看日韩| 欧美午夜网站| 久久亚洲精品中文字幕蜜潮电影| 亚洲日本欧美| 岛国精品一区| 亚洲精品影视| 在线天堂中文资源最新版| 久久国产福利| 都市激情国产精品| 在线精品观看| 国产精品不卡| 亚洲一区二区三区久久久| 精品九九在线| 亚洲日产av中文字幕| 岛国av在线网站| 视频一区二区三区入口| 手机在线电影一区| 亚洲精品乱码久久久久久蜜桃麻豆| 福利视频一区| 日本成人在线视频网站| 亚洲一级二级| 欧美亚洲tv| 欧美精品一区二区三区精品| 国产日产精品一区二区三区四区的观看方式| 日韩精品第一区| 日韩av中文字幕一区二区| 欧美一区二区三区高清视频 | 免费一区二区三区在线视频| 欧美/亚洲一区| 精品亚洲成人| 亚洲精品美女91| 久久美女性网|