精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

都說了別用BeanUtils.copyProperties,這不翻車了吧

開發
即使再小再簡單的需求,作為研發開發完畢之后,我們可以直接上線么?其實很多時候事故往往就是由于“不以為意”發生的。

一、故事

新年新氣象,小貓也是踏上了新年新征程,自從小貓按照老貓給的建議【系統梳理大法】完完整整地梳理完畢系統之后,小貓對整個系統的把控可謂又是上到了一個新的高度。開工一周,事情還不是很多,寥寥幾個需求,小貓分分鐘搞定。

類似于開放平臺的老六接到客戶的需求,需要在查詢訂單新增一個下單時間的返回值,然后這就需要提供底層服務的小貓在接口層給出這個字段,然后老六通過包裝之后給客戶。由于需求比較簡單,所以加完字段之后,老六和小貓也就直接上線了。

上線之后事兒來了,對面客戶研發一直詢問為什么還是沒有下單時間,總是空的。老六于是直接找到了小貓,可是小貓經過了一系列的自測發現返回值都是有的,后來排查到在老六封裝之后值不見了。經過仔細排查,終于找到了問題,雖然沒有造成太大的影響,但是總歸給客戶研發的心里留下了一個不好的印象。

雖然下單時間老六和小貓定義的都是orderTime這樣一個字段,但是字段類型小貓用的是Date類型而老六用的是LocalDate,恰巧老六在進行對象賦值的時候偷了個懶直接用了spring的BeanUtils.copyProperties工具類,于是導致日期類型的值并沒有被賦值過去,踩坑了。

老六這才回想起前段時間架構師在群里@ALL的一段話,“大家用BeanUtils拷貝對象的時候注意點,有坑啊,大家盡量用get,set方法啊”。當時的老六不以為意,想著,“切,這得多麻煩,一個個set不花時間啊,有工具類不用”。現在想來是真踩到BeanUtils的坑了。

老六一邊改著代碼一邊叨叨:“這也沒說坑在哪里啊......”

二、盤點BeanUtils.copyProperties坑點

相信很多小伙伴在日常開發的過程中都用過BeanUtils.copyProperties。因為我們日常開發中,經常涉及到DO、DTO、VO對象屬性拷貝賦值。很多開發為了省去繁瑣而又無聊的set方法往往都會用到這樣的工具類進行值拷貝,但是看似簡單的拷貝程序,其實往往暗藏坑點,這不上面的老六就踩雷了么。

下面咱們一起來盤點一下這個拷貝存在哪些坑點吧。見下圖。

盤點

三、目標賦值對象屬性非預期

這里主要說的是從老對象進行屬性拷貝到新對象之后,新對象的屬性值不是所期待的。這里分為兩種。

  • 兩對象屬性命名一致,但是類型不一致(即老六遇到的坑點)。
  • 由于開發編寫沒有核對好,兩個對象屬性值不一致,卻采用了拷貝,導致異常。
  • loombook+Boolean類型數據+is屬性開頭的坑。
  • 不同內部類,相同屬性,目標對象賦值有問題。

1.類型不匹配

我們來重放一下老六和小貓遇到坑。代碼如下:

/**
 * 公眾號:程序員老貓 
 **/
public class BeanCopyHelper {
    public static void main(String[] args) {
        Origin a = new Origin();
        a.setOrderTime(new Date());

        Target b = new Target();
        BeanUtils.copyProperties(a,b);
        System.out.println(a.getOrderTime());
        System.out.println(b.getOrderTime());
    }
}
@Data
class Origin {
    private Date orderTime;
}
@Data
class Target {
    private LocalDate orderTime;
}

輸出結果:

Sun Feb 25 21:52:22 CST 2024
null

我看看到兩個對象的命名雖然是一致的,但是一個是Date另外一個是LocaDate,這樣導致值并沒有被賦值過去。

2.兩對象屬性命名差異導致賦值不成功

這種拷貝不成功的原因很多時候是由于研發人員粗心,沒有校對好導致的。例如下面兩個類:

@Data
class Origin {
    private Date ordertime;
}
@Data
class Target {
    private Date orderTime;
}

這種顯而易見是無法賦值成功的,因為仔細看來兩個屬性名稱不一致。當然不會賦值成功了。

四、loombook+Boolean類型數據+is屬性開頭的坑

這種情況是比較極端的,在用loombook和不用loombook的情況下是不一樣的。我們看一下下面例子。當我們不用loombook的時候,如下代碼:

public class BeanCopyHelper {
    public static void main(String[] args) {
        Origin origin = new Origin();
        origin.setOrderTime(true);
        Target target = new Target();
        BeanUtils.copyProperties(origin,target);
        System.out.println(origin.getOrderTime());
        System.out.println(target.isOrderTime());
    }
}

class Origin {
    private Boolean isOrderTime;
    public Boolean getOrderTime() {
        return isOrderTime;
    }
    public void setOrderTime(Boolean orderTime) {
        isOrderTime = orderTime;
    }
}
class Target {
    private boolean isOrderTime;
    public boolean isOrderTime() {
        return isOrderTime;
    }
    public void setOrderTime(boolean orderTime) {
        isOrderTime = orderTime;
    }
}

上面的代碼中,我們看到基礎屬性的類型分別是包裝類還有一個是非包裝類,屬性的命名都是一致的。其最終的輸出結果,我們看到兩者是一致的:

true
true

如果我們使用loombook的時候,問題就來了,我們看一下loombook改造之后的代碼:

public class BeanCopyHelper {
    public static void main(String[] args) {
        Origin origin = new Origin();
        origin.setIsOrderTime(true);
        Target target = new Target();
        BeanUtils.copyProperties(origin,target);
        System.out.println(origin.getIsOrderTime());
        System.out.println(target.isOrderTime());
    }
}

@Data
class Origin {
    private Boolean isOrderTime;
}
@Data
class Target {
    private boolean isOrderTime;
}

最后的輸出結果為:

true
false

那么這是為什么呢?老貓在這里簡單分享一下,BeanUtils.copyProperties用戶在兩個對象之間進行屬性的復制,底層基于JavaBean的內省機制,通過內省得到拷貝源對象和目的對象屬性的讀方法和寫方法,然后調用對應的方法進行屬性的復制。

所以在進行拷貝時,如果手動生成get和set那么方法分別為:getOrderTime()以及setOrderTime()。我們再來看一下如果采用LoomBook的時候,那么對應的get和set的方法分別為:getIsOrderTime()以及setOrderTime(),拋開set和get本身關鍵字不看,那么后面的肯定是對應不起來了。

這里我們再發散一下,如果說對應的兩個類其屬性壓根連get和set方法都沒有設置,那么兩個對象能夠被拷貝成功嗎?答案是顯而易見的,無法被拷貝成功。所以這里也是用這個拷貝方法的時候的一個坑點。

不同內部類,相同屬性,目標對象賦值有問題。

看標題還是比較抽象的,我們一起來看一下下面的代碼實現:

public class BeanCopyHelper {
    public static void main(String[] args) {
        Origin test1 = new Origin();
        test1.outerName = "程序員老貓";
        Origin.InnerClass innerClass = new Origin.InnerClass();
        innerClass.InnerName = "程序員老貓 內部類";
        test1.innerClass = innerClass;
        System.out.println(test1);
        Target test2 = new Target();
        BeanUtils.copyProperties(test1, test2);
        System.out.println(test2);
    }
}
@Data
class Origin {
    public String outerName;
    public Origin.InnerClass innerClass;

    @Data
    public static class InnerClass {
        public String InnerName;
    }
}
@Data
class Target {
    public String outerName;
    public Target.InnerClass innerClass;

    @Data
    public static class InnerClass {
        public String InnerName;
    }
}

輸出最終結果如下:

Origin(outerName=程序員老貓, innerClass=Origin.InnerClass(InnerName=程序員老貓 內部類))
Target(outerName=程序員老貓, innerClass=null)

最終我們發現其內部內的屬性并沒有被賦值過去。

五、引包沖突導致問題

BeanUtils.copyProperties其實同命名的方法存在于兩個不同的包中,一個是spring的另外一個是apache的,如果不注意的話,很容易就會有問題。如下代碼:

//org.springframework.beans.BeanUtils(源對象在左邊,目標對象在右邊)
public static void copyProperties(Object source, Object target) throws BeansException 
//org.apache.commons.beanutils.BeanUtils(源對象在右邊,目標對象在左邊)
public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException

位于org.springframework.beans包下。其copyProperties方法實現原理和Apache BeanUtils.copyProperties原理類似,默認實現淺拷貝 區別在于對PropertyDescriptor(內省機制相關)的處理結果做了緩存來提升性能。這里大家有興趣可以自行去查閱一下源代碼。

六、查找字段引用困難

當我們在排查問題的時候,或者在熟悉業務的過程中,常常會想要看一個整個屬性值的調用鏈路,從而來跟蹤其設值源頭。如果我想看當前的這個屬性是什么時候被設值值的時候,老貓的做法通常是找到當前的那個屬性的set方法,然后使用idea中的“Find Usages”或者快捷鍵ALT+F7。得到需要屬性值被設置的地方。如下圖,就能清晰看到在哪里設值了。

調用鏈路

但是,如果用了工具類進行拷貝的話,那么在代碼復雜的情況下,我們就很難定位其在什么時候被調用的了。

七、BeanUtils.copyProperties是淺拷貝

在這里,咱們要回憶一下什么時候淺拷貝,什么是深拷貝。淺拷貝:淺拷貝是指創建一個新對象,然后將原始對象的內容逐個復制到新對象中。在淺拷貝中,只有最外層對象被復制,而內部的嵌套對象只是引用而已,沒有被遞歸復制。這意味著原始對象和淺拷貝對象之間共享內部對象,修改其中一個對象的內部對象會影響到另一個對象。如下示意圖:

淺拷貝

深拷貝:深拷貝是指在進行復制操作時,創建一個完全獨立的新對象,并遞歸地復制原始對象及其所有子對象。換句話說,深拷貝會復制對象的所有層級,包括對象的屬性、嵌套對象、引用等。因此,原始對象和復制對象是完全獨立的,修改其中一個對象不會影響另一個對象。

深拷貝

根據上面的描述,我們通過代碼來重現一下坑點,具體如下:

public class Address {
    private String city;
    ...
}
public class Person {
    private String name;
    private Address address;
    ...
}
public class TestMain {
    public static void main(String[] args) {
        Person sourcePerson = new Person();
        sourcePerson.setName("老六");
        Address address = new Address();
        address.setCity("上海 徐匯");
        sourcePerson.setAddress(address);
        Person targetPerson = new Person();
        BeanUtils.copyProperties(sourcePerson, targetPerson);
        System.out.println(targetPerson.getAddress().getCity());
        sourcePerson.getAddress().setCity("上海 黃埔");
        System.out.println(targetPerson.getAddress().getCity());
    }
}

輸出結果為:

上海 徐匯
上海 黃埔

我們很明顯地看到操作原始屬性的地址,直接影響到了新對象的屬性的地址。所以這個坑大家也要當心。當然由于淺拷貝的原因導致拷貝出現問題還涉及集合類進行拷貝。例如我們需要對List或者Map進行拷貝的時候也不能直接去拷貝list以及map。

八、性能問題

由于BeanUtils.copyProperties其實底層是通過反射實現的,所以其程序執行的效率還是比較低的。我們看一下下面的對比代碼:

public class BeanCopyHelper {
    public static void main(String[] args) {
        Origin test1 = new Origin();
        test1.outerName = "公眾號:程序員老貓";
        Target test2 = new Target();
        long beginTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {  //循環10萬次
            test2.setOuterName(test1.getOuterName());
        }
        System.out.println(test2);
        System.out.println("common setter time:" + (System.currentTimeMillis() - beginTime));
        long beginTime2 = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {  //循環10萬次
            BeanUtils.copyProperties(test1, test2);
        }
        System.out.println(test2);
        System.out.println("common setter time:" + (System.currentTimeMillis() - beginTime2));
    }
}

@Data
class Origin {
    public String outerName;
}
@Data
class Target {
    public String outerName;
}

輸出結果如下:

Target(outerName=公眾號:程序員老貓)
common setter time:14
Target(outerName=公眾號:程序員老貓)
common setter time:291

上述結果,很好地證明了這個結論。有小伙伴肯定會說,這種場景應該比較少吧,太極端了。那么極端嗎?大家回憶一下上面老貓提到的,如果用這個工具復制List或者Map這種集合的時候,其實如果把List和Map當做整個對象來復制往往是失敗的。相信如果不是小白的話一般都會知道這個坑點,為了解決這個問題,很多小伙伴可能會選擇在List或者Map等集合內部進行循環一一遍歷去進行單個對象的拷貝賦值,那么這樣的場景下,性能是不是就受到了影響呢?

九、替換方案

既然說了bean拷貝工具類這么多的壞話,那么我們如何去替換這種寫法呢?第一種:當然是直接采用原始的get以及set方法了。這種方式好像除了代碼長了一些之外好像也沒有什么缺點了。有小伙伴可能會跳出來說,這不擼起來麻煩么。不著急,idea這款強大的工具不是已經給我們提供插件了么。如下圖:

插件示意圖

第二種:使用映射工具庫,如MapStruct、ModelMapper等,它們可以自動生成屬性映射的代碼。這些工具庫可以減少手動編寫setter方法的工作量,并提供更好的性能。如下使用代碼:

    /**
     * 公眾號:程序員老貓
     **/
    @Mapper  
    public interface SourceTargetMapper {  
    SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);  

    @Mapping(source = "name", target = "name")  
    @Mapping(source = "age", target = "age")  
    Target mapToTarget(Source source);  
    }  

    //使用
    Target target = SourceTargetMapper.INSTANCE.mapToTarget(source);

上述這兩種替換方案,說真的作為開發者而言,老貓更喜歡第一種,簡單方便,而且不需要依賴第三方maven依賴。第二種個人感覺用起來反而比較繁瑣,上述當然純屬個人偏好。

十、總結

上述小貓和老六的案例中,其實存在的問題需要我們思考的。

即使再小再簡單的需求,作為研發開發完畢之后,我們可以直接上線么?其實很多時候事故往往就是由于“不以為意”發生的。事故的發生往往也遵循“墨菲定律”,這就要求我們更要敬畏生產,再小的需求點都需要經過嚴格的測試驗證才能上線。

說了那么多BeanUtils.copyProperties的壞話,那么這種拷貝方式是不是真的就一無是處呢?其實不是的,所謂存在即合理。很多時候使用的時候踩坑說白了我們沒有理解好這個拷貝工具的特性。很多時候大家在使用使用一個技術的時候都是囫圇吞棗,為了使用而去使用,壓根就沒有深入了解這個技術的特性以及使用注意點。所以在我們使用第三方工具的時候,我們需要更好地了解其特性,知其所以然才能更好更正確地使用。小伙伴們你們覺得呢?

責任編輯:趙寧寧 來源: 程序員老貓
相關推薦

2023-05-29 08:56:34

深拷貝淺拷貝對象

2024-06-04 00:10:00

開發拷貝

2022-12-07 08:45:45

工具Springweb

2022-12-09 07:53:20

vo2dto方法AOP

2015-06-24 09:36:04

DockerCon 2Docker

2016-10-13 11:23:07

阿里云云棲大會云計算

2018-08-27 14:52:00

用友

2015-07-03 18:36:27

2017-12-04 11:49:45

互聯網阿里巴巴蘋果

2015-03-30 10:37:48

博鰲論壇互聯網

2016-12-27 07:30:08

人工智能蘋果

2018-04-12 09:05:34

扎克伯格 Facebook數據

2019-01-04 15:38:14

云計算UCloud優刻得

2020-05-26 13:52:55

5G工業互聯網兩會

2025-03-12 12:18:00

2018-01-25 11:06:19

2020-12-21 14:46:56

代碼開發程序員

2020-07-10 14:33:21

人工智能李彥宏馬云

2025-07-14 09:12:00

2019-05-21 09:43:58

網絡安全等保2.0等級保護
點贊
收藏

51CTO技術棧公眾號

欧美综合视频| 免费的毛片视频| 精品国产第一国产综合精品| 一区二区三区中文在线观看| 久久国产精品久久精品国产| 在线视频1卡二卡三卡| 欧美日韩三级| 一区二区三区 在线观看视| 一卡二卡三卡四卡五卡| 中文字幕在线直播| 亚洲欧美国产三级| 欧美日本韩国国产| www.色亚洲| 日韩国产高清影视| 久久久久久国产精品美女| 在线免费观看日韩av| 麻豆精品久久| 欧美亚洲日本国产| 国产情侣第一页| 午夜在线小视频| 91尤物视频在线观看| 91久久精品美女高潮| 丰满少妇xoxoxo视频| 欧美fxxxxxx另类| 一本色道久久88精品综合| 国产乱淫av片| 精品中文在线| 欧美日韩免费高清一区色橹橹| 麻豆tv在线播放| 在线看三级电影| 国产精品久久久久久久久动漫| 国产久一道中文一区| 91久久久久国产一区二区| 美日韩精品视频| 69**夜色精品国产69乱| 欧美三级日本三级| 99久久精品国产亚洲精品| 一本色道久久综合狠狠躁篇的优点 | 国产成人亚洲综合| 国产无遮挡免费视频| 欧美国产先锋| 欧美猛交ⅹxxx乱大交视频| 长河落日免费高清观看| 久久成人高清| 亚洲免费小视频| 亚洲制服丝袜在线播放| 高潮久久久久久久久久久久久久 | 韩国三级丰满少妇高潮| 91大神在线观看线路一区| 一本一本大道香蕉久在线精品| 久久国产精品网| 丁香花在线影院| 亚洲最大的成人av| 免费一级淫片aaa片毛片a级| 亚洲小说区图片| 一区二区三区四区亚洲| 色哟哟免费网站| 菠萝蜜视频国产在线播放| 成人欧美一区二区三区小说| 在线成人av电影| 2021国产在线| 亚洲一区二区欧美日韩| 久草视频国产在线| 亚洲人成在线网站| 日本高清免费不卡视频| 婷婷六月天在线| 先锋影音网一区二区| 69久久99精品久久久久婷婷| 原创真实夫妻啪啪av| 日韩一区二区三区高清在线观看| 欧美成人vps| 亚洲国产综合视频| av一区二区在线观看| 日韩在线视频网| 玖玖爱免费视频| 国产欧美日韩亚洲一区二区三区| 青青草成人在线| 中文天堂在线资源| 国产美女主播视频一区| 高清一区二区三区视频| 欧美偷拍视频| 亚洲国产精品99久久久久久久久| 制服诱惑一区| 69av成人| 欧美色综合久久| 奇米777在线| 日韩精品a在线观看91| 一夜七次郎国产精品亚洲| 九九热最新地址| 在线视频观看日韩| 国产精品久久久久999| 国内精品久久久久久久久久久| 成人av在线播放网站| 日韩精品久久久免费观看| 欧美jizzhd欧美| 香蕉加勒比综合久久| 成人亚洲视频在线观看| 成人av动漫| 中文字幕免费国产精品| 国产在线观看你懂的| 日韩精品色哟哟| 99电影网电视剧在线观看| 无码h黄肉3d动漫在线观看| 中文字幕在线不卡| 国产特级淫片高清视频| 国产在线一区不卡| 亚洲香蕉伊综合在人在线视看| 国产探花在线免费观看| 水野朝阳av一区二区三区| 91视频婷婷| 在线观看h片| 日韩欧美999| 欧美xxxxx少妇| 66视频精品| 国产成人亚洲精品| 天天操天天操天天操| 中文字幕一区三区| 成人黄色一区二区| 人体久久天天| 国内揄拍国内精品少妇国语| 91九色蝌蚪91por成人| 国产亚洲一本大道中文在线| 男人插女人视频在线观看| 四虎精品一区二区免费| 亚洲午夜精品视频| 日韩免费不卡视频| 国产成人精品影视| 一本二本三本亚洲码| 激情小说亚洲| 亚洲新声在线观看| 制服.丝袜.亚洲.中文.综合懂色| 国产999精品久久久久久| 在线亚洲美日韩| 日本在线视频一区二区| 亚洲欧美中文字幕| 日韩 欧美 综合| 99精品在线免费| 亚洲国产精品无码观看久久| 99精品在免费线中文字幕网站一区| 日韩在线视频导航| 国产精品久久久午夜夜伦鲁鲁| 国产视频一区在线观看 | 欧美男女交配| 亚洲男人第一网站| 成人a v视频| 欧美国产日韩精品免费观看| 日韩亚洲在线视频| 欧美精品一区二区三区精品| 日本人成精品视频在线| 麻豆导航在线观看| 在线免费观看不卡av| 男人的天堂官网| 日本美女一区二区| 亚洲人成网站在线播放2019| 欧美韩国日本| 久久久精品视频成人| 国产免费不卡av| 一区二区三区日韩精品视频| 被黑人猛躁10次高潮视频| 欧美午夜一区二区福利视频| 国产一区二区在线观看免费播放| 国产剧情av在线播放| 亚洲欧美日韩在线一区| 瑟瑟视频在线免费观看| 国产精品福利在线播放| 欧美性受xxxx黒人xyx性爽| 欧美69wwwcom| 国产一区二区三区四区hd| 欧美电影免费看| 久久精品国产电影| 免费观看黄一级视频| 五月婷婷欧美视频| 91社区视频在线观看| 国产酒店精品激情| 少妇高潮喷水在线观看| 国产一区三区在线播放| 91网站在线看| 蜜桃视频动漫在线播放| 中文国产成人精品| 国产sm主人调教女m视频| 红桃av永久久久| 99久久久无码国产精品不卡| 国产凹凸在线观看一区二区| 国产淫片av片久久久久久| 99久久久久国产精品| 国产欧美日韩综合精品二区| 婷婷综合六月| 九九热99久久久国产盗摄| 亚洲 欧美 激情 小说 另类| 欧美三日本三级三级在线播放| 久久久久亚洲av片无码下载蜜桃| 久久五月婷婷丁香社区| 特级西西444www| 亚洲欧美日韩国产一区| 中文字幕欧美日韩一区二区三区| 牛牛影视久久网| 国产在线高清精品| 亚洲最大网站| 九九热这里只有精品免费看| 黄色片免费在线| 精品国产乱码久久久久久浪潮| 久久永久免费视频| 亚洲图片自拍偷拍| 永久免费未视频| 91天堂素人约啪| 永久免费黄色片| 蜜桃av一区二区三区| 妞干网在线观看视频| 五月精品视频| 日本在线免费观看一区| 粉嫩精品导航导航| 91午夜在线播放| av免费在线一区| 456国产精品| 丝袜在线观看| 久久久999国产| 99re在线视频| 亚洲欧美日韩高清| 亚洲 欧美 自拍偷拍| 欧美mv日韩mv国产网站app| 亚洲性生活大片| 色综合色狠狠天天综合色| 日本一区二区欧美| 亚洲一区二区三区四区五区黄 | 亚洲成人免费视频| 久久r这里只有精品| 亚洲视频一区二区在线观看| 老司机福利在线观看| 欧美国产97人人爽人人喊| 黄色性生活一级片| 97精品久久久久中文字幕| 无码人妻一区二区三区免费n鬼沢| 久草在线在线精品观看| 999精彩视频| 日本va欧美va瓶| 手机看片福利日韩| 日韩激情一区二区| 国产又粗又长又大的视频| 久久精品伊人| 一本久道中文无码字幕av| 久久久人人人| 日韩在线xxx| 日本va欧美va欧美va精品| 最新中文字幕2018| 蜜臀av性久久久久蜜臀aⅴ| 校园春色 亚洲色图| 免费观看在线色综合| 爱情岛论坛亚洲首页入口章节| 奇米一区二区三区| 久久成年人网站| 国产一区视频网站| 国产调教打屁股xxxx网站| 成人免费观看av| 日韩 中文字幕| 国产色产综合产在线视频| 中文字幕在线观看免费高清| 亚洲国产成人午夜在线一区| 91ts人妖另类精品系列| 亚洲三级在线观看| 久久精品一级片| 污片在线观看一区二区| 亚洲婷婷综合网| 欧美无人高清视频在线观看| 一级黄在线观看| 日韩欧美国产电影| 色窝窝无码一区二区三区| 亚洲欧美日韩成人| 久热国产在线| 国内精品久久久久久| 都市激情亚洲综合| 国产日韩欧美综合| aaa国产精品视频| 欧美亚洲丝袜| 先锋资源久久| 黄色大片中文字幕| 日本不卡中文字幕| av天堂一区二区| 国产欧美一区二区精品性色| 91香蕉一区二区三区在线观看| 一区二区成人在线| 在线视频一区二区三区四区| 欧美精品成人一区二区三区四区| 日批视频免费播放| 国产亚洲精品激情久久| 久操视频在线| 青青草99啪国产免费| 少妇精品视频在线观看| 精品一卡二卡三卡四卡日本乱码 | 黄页免费在线观看视频| 日韩精品欧美精品| 韩国av中国字幕| 国产精品三级电影| 国产精品第九页| 在线成人免费观看| 日本护士...精品国| 久久国产精品偷| 亚洲精品永久免费视频| 91在线观看网站| 精品一级毛片| 奇米影视亚洲色图| 国内精品久久久久影院色| 色天使在线视频| 亚洲精品老司机| 超碰在线免费97| 亚洲激情在线视频| 18av在线视频| 国产男人精品视频| 西瓜成人精品人成网站| 欧美a级免费视频| 美腿丝袜亚洲三区| av无码av天天av天天爽| 一区二区三区精品| 在线观看中文字幕网站| 亚洲欧美福利视频| а√在线中文网新版地址在线| 91精品视频在线免费观看| 精品国产一区二区三区小蝌蚪 | 日韩一级特黄毛片| 美女看a上一区| 日本成人免费视频| 色综合久久66| 午夜视频www| 97人人爽人人喊人人模波多| 亚洲午夜国产成人| 婷婷五月色综合| 日韩和欧美的一区| 欧美成人午夜精品免费| 欧美日韩国产精品专区| 欧美一区二区黄片| 国模私拍一区二区三区| 天堂精品在线视频| 国产精品亚洲天堂| 久草热8精品视频在线观看| 日韩毛片无码永久免费看| 一本大道久久a久久精二百| 欧美一区二区少妇| 51午夜精品视频| 女厕嘘嘘一区二区在线播放| 日韩av在线综合| 久久久久久久综合狠狠综合| 中文在线第一页| 亚洲精选中文字幕| 欧美性猛交xxx高清大费中文| 久久精品日产第一区二区三区| 夜夜嗨网站十八久久| 免费的av网站| 一本大道久久a久久精品综合| 欧洲一级在线观看| 国产精品免费网站| 99久久久久| 男人的天堂免费| 亚洲国产cao| 天天色综合久久| 热99精品只有里视频精品| 国产剧情在线观看一区| 一区二区三区 欧美| 亚洲人一二三区| www.中文字幕| 午夜精品理论片| 国产a久久精品一区二区三区| 免费在线观看的毛片| 国产精品福利av| 国产成人精品亚洲精品色欲| 欧美精品福利在线| 婷婷成人综合| 亚洲欧美视频二区| 樱桃国产成人精品视频| 少妇无码一区二区三区| 日韩美女av在线免费观看| 成人6969www免费视频| 午夜国产福利在线观看| 香蕉乱码成人久久天堂爱免费| 韩国中文字幕2020精品| 91视频免费网站| 成人免费在线观看| 激情成人中文字幕| 五月婷婷狠狠干| 国产精品美女www爽爽爽视频| 亚洲激情五月| 91精品国产自产| 欧美情侣在线播放| 97久久人人超碰caoprom| 欧洲一区二区在线| 国产激情一区二区三区桃花岛亚洲 | 秋霞蜜臀av久久电影网免费| 午夜宅男在线视频| 亚洲国产另类精品专区| 成年人视频在线免费观看| 亚洲一区二区三区视频播放| 欧美亚洲专区| 欧美日韩大片在线观看| 夜夜躁日日躁狠狠久久88av| 综合激情五月婷婷| 欧美成人三级在线播放| 天天av天天翘天天综合网色鬼国产| 最新真实国产在线视频| 久久久久久国产精品mv| 国内精品久久久久影院色| 国产黄网在线观看| 欧美激情在线视频二区|