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

MapStruct教程-枚舉的五種用法

開(kāi)發(fā) 前端
日常開(kāi)發(fā)中,我們經(jīng)常會(huì)用到枚舉,有時(shí)候會(huì)涉及枚舉之間的映射、枚舉與int或String之間的映射等。本文一起看下,MapStruct中如何實(shí)現(xiàn)。

你好,我是看山。

日常開(kāi)發(fā)中,我們經(jīng)常會(huì)用到枚舉,有時(shí)候會(huì)涉及枚舉之間的映射、枚舉與int或String之間的映射等。本文一起看下,MapStruct中如何實(shí)現(xiàn)。

一、將一個(gè)枚舉映射到另一個(gè)枚舉

(一)用例說(shuō)明

  • 在 REST API 中,將外部API狀態(tài)碼轉(zhuǎn)換為我們應(yīng)用內(nèi)部的狀態(tài)枚舉;
  • 與第三方庫(kù)集成時(shí),兩個(gè)服務(wù)間枚舉定義不同,通常需要處理枚舉映射。

(二)使用MapStruct實(shí)現(xiàn)映射

這里我們會(huì)用到@ValueMapping注解,可以實(shí)現(xiàn)源常量值到目標(biāo)常量值的映射。

我們看下實(shí)際應(yīng)用。首先定義一個(gè)表示交通信號(hào)的枚舉TrafficSignal:

public enum TrafficSignal {
    OFF,
    STOP,
    GO;
}

在定義一個(gè)表示道路標(biāo)記的源枚舉RoadSign:

public enum RoadSign {
    OFF,
    HALT,
    MOVE;
}

接下來(lái),我們定義一個(gè)映射:

@Mapper
public interface TrafficSignalMapper {
    TrafficSignalMapper INSTANCE = Mappers.getMapper(TrafficSignalMapper.class);

    @ValueMapping(target = "GO", source = "MOVE")
    @ValueMapping(target = "STOP", source = "HALT")
    TrafficSignal toTrafficSignal(RoadSign source);
}

看下生成的實(shí)現(xiàn):

public class TrafficSignalMapperImpl implements TrafficSignalMapper {

    @Override
    public TrafficSignal toTrafficSignal(RoadSign source) {
        if ( source == null ) {
            return null;
        }

        TrafficSignal trafficSignal;

        switch ( source ) {
            case MOVE: trafficSignal = TrafficSignal.GO;
            break;
            case HALT: trafficSignal = TrafficSignal.STOP;
            break;
            case OFF: trafficSignal = TrafficSignal.OFF;
            break;
            default: throw new IllegalArgumentException( "Unexpected enum constant: " + source );
        }

        return trafficSignal;
    }
}

可以看到,因?yàn)镺FF是名字相同,雖然沒(méi)有定義映射關(guān)系,MapStruct會(huì)自動(dòng)匹配。剩下兩個(gè)枚舉值根據(jù)我們的定義匹配上了。

這里需要注意的是,我們需要確保將源枚舉的所有值都映射到目標(biāo)枚舉,如果沒(méi)有完全匹配上,會(huì)走到default分支,拋出IllegalArgumentException異常。

二、將字符串映射到枚舉

我們繼續(xù)看下字符串與枚舉之間的映射。有了前面的基礎(chǔ),我們這里直接上手,還是使用@ValueMapping注解,字符串的值都是小寫,需要轉(zhuǎn)換為TrafficSignal枚舉:

@ValueMapping(target = "OFF", source = "off")
@ValueMapping(target = "GO", source = "move")
@ValueMapping(target = "STOP", source = "halt")
TrafficSignal stringToTrafficSignal(String source);

我們看下生成的代碼:

@Override
public TrafficSignal stringToTrafficSignal(String source) {
    if ( source == null ) {
        return null;
    }

    TrafficSignal trafficSignal;

    switch ( source ) {
        case "off": trafficSignal = TrafficSignal.OFF;
        break;
        case "move": trafficSignal = TrafficSignal.GO;
        break;
        case "halt": trafficSignal = TrafficSignal.STOP;
        break;
        case "OFF": trafficSignal = TrafficSignal.OFF;
        break;
        case "STOP": trafficSignal = TrafficSignal.STOP;
        break;
        case "GO": trafficSignal = TrafficSignal.GO;
        break;
        default: throw new IllegalArgumentException( "Unexpected enum constant: " + source );
    }

    return trafficSignal;
}

可以看到,除了我們定義的三個(gè)映射,MapStruct還會(huì)自動(dòng)將枚舉的name()也作為映射依據(jù),換句話說(shuō),如果我們輸入的字符串與枚舉正好是一一對(duì)應(yīng)的,那就可以不用定義映射關(guān)系了。

三、處理自定義名稱轉(zhuǎn)換

還有一種情況是,需要映射的枚舉值有統(tǒng)一的約束,比如遵循不同的大小寫、前綴或后綴等,比如,一個(gè)信號(hào)可以是Go、go、GO、Go_Value、Value_Go等。

(一)后綴

假如我們的目標(biāo)枚舉相較于源枚舉有統(tǒng)一的后綴,比如:GO到GO_VALUE。

public enum TrafficSignalSuffixed {
    OFF_VALUE,
    STOP_VALUE,
    GO_VALUE
}

此時(shí),我們可以用到@EnumMapping注解,定義名稱轉(zhuǎn)換策略是后綴,然后定義后綴值:

@EnumMapping(nameTransformationStrategy = SUFFIX_TRANSFORMATION, configuration = "_VALUE")
TrafficSignalSuffixed applySuffix(TrafficSignal source);

@EnumMapping為枚舉類型定義自定義映射,nameTransformationStrategy指定在映射之前應(yīng)用于枚舉常量名稱的轉(zhuǎn)換策略,并使用configuration定義控制值。

生成結(jié)果是:

@Override
public TrafficSignalSuffixed applySuffix(TrafficSignal source) {
    if ( source == null ) {
        return null;
    }

    TrafficSignalSuffixed trafficSignalSuffixed;

    switch ( source ) {
        case OFF: trafficSignalSuffixed = TrafficSignalSuffixed.OFF_VALUE;
        break;
        case STOP: trafficSignalSuffixed = TrafficSignalSuffixed.STOP_VALUE;
        break;
        case GO: trafficSignalSuffixed = TrafficSignalSuffixed.GO_VALUE;
        break;
        default: throw new IllegalArgumentException( "Unexpected enum constant: " + source );
    }

    return trafficSignalSuffixed;
}

需要注意,@EnumMapping應(yīng)用的場(chǎng)景是枚舉值完全符合指定策略,如果其中有某個(gè)值不符合,編譯時(shí)會(huì)出現(xiàn)異常“The following constants from the source enum have no corresponding constant in the target enum and must be be mapped via adding additional mappings: xxx.”

(二)前綴

假如我們的目標(biāo)枚舉相較于源枚舉有統(tǒng)一的前綴綴,比如:GO到VALUE_GO。

public enum TrafficSignalPrefixed {
    VALUE_OFF,
    VALUE_STOP,
    VALUE_GO;
}

定義映射:

@EnumMapping(nameTransformationStrategy = PREFIX_TRANSFORMATION, configuration = "VALUE_")
TrafficSignalPrefixed applyPrefix(TrafficSignal source);

PREFIX_TRANSFORMATION是告訴MapStruct,需要在源枚舉增加前綴VALUE_。

生成的代碼是:

public TrafficSignalPrefixed applyPrefix(TrafficSignal source) {
    if ( source == null ) {
        return null;
    }

    TrafficSignalPrefixed trafficSignalPrefixed;

    switch ( source ) {
        case OFF: trafficSignalPrefixed = TrafficSignalPrefixed.VALUE_OFF;
        break;
        case STOP: trafficSignalPrefixed = TrafficSignalPrefixed.VALUE_STOP;
        break;
        case GO: trafficSignalPrefixed = TrafficSignalPrefixed.VALUE_GO;
        break;
        default: throw new IllegalArgumentException( "Unexpected enum constant: " + source );
    }

    return trafficSignalPrefixed;
}

(三)去除后綴

假如我們的目標(biāo)枚舉相較于源枚舉缺少統(tǒng)一的后綴,比如:GO_VALUE到GO。

我們可以使用STRIP_SUFFIX_TRANSFORMATION指定去除后綴:

@EnumMapping(nameTransformationStrategy = STRIP_SUFFIX_TRANSFORMATION, configuration = "_VALUE")
TrafficSignal stripSuffix(TrafficSignalSuffixed source);

(四)去除前綴

假如我們的目標(biāo)枚舉相較于源枚舉缺少統(tǒng)一的前綴,比如:VALUE_GO到GO。

我們可以使用STRIP_PREFIX_TRANSFORMATION指定去除前綴:

@EnumMapping(nameTransformationStrategy = STRIP_PREFIX_TRANSFORMATION, configuration = "VALUE_")
TrafficSignal stripPrefix(TrafficSignalPrefixed source);

(五)小寫

假如我們的目標(biāo)枚舉是源枚舉的小寫,比如:GO變?yōu)間o:

public enum TrafficSignalLowercase {
    off,
    stop,
    go;
}

我們需要使用CASE_TRANSFORMATION策略,并定義策略是lower。

定義映射:

@EnumMapping(nameTransformationStrategy = CASE_TRANSFORMATION, configuration = "lower")
TrafficSignalLowercase applyLowercase(TrafficSignal source);

(六)大寫

假如我們的目標(biāo)枚舉是源枚舉的小寫,比如:go變?yōu)镚O:

還是使用CASE_TRANSFORMATION策略,并定義策略是upper。

@EnumMapping(nameTransformationStrategy = CASE_TRANSFORMATION, configuration = "upper")
TrafficSignal applyUppercase(TrafficSignalLowercase source);

(七)首字母大寫

我們還可以指定首字母大寫的映射,例如,go變?yōu)镚o。

定義下目標(biāo)枚舉

public enum TrafficSignalCapital {
    Off,
    Stop,
    Go;
}

還是使用CASE_TRANSFORMATION策略,并定義策略是capital。

@EnumMapping(nameTransformationStrategy = CASE_TRANSFORMATION, configuration = "capital")
TrafficSignalCapital lowercaseToCapital(TrafficSignalLowercase source);

四、枚舉映射的其他用例

還有些場(chǎng)景中,我們需要將枚舉映射到其他類型,接下來(lái),一起看看如何處理。

(一)將枚舉映射到字符串

定義映射:

@ValueMapping(target = "off", source = "OFF")
@ValueMapping(target = "go", source = "GO")
@ValueMapping(target = "stop", source = "STOP")
String trafficSignalToString(TrafficSignal source);

我們使用@ValueMapping將枚舉值映射到字符串,其實(shí)是和從字符串轉(zhuǎn)枚舉相似的配置邏輯。

(二)將枚舉映射到整數(shù)或其他數(shù)字類型

因?yàn)閿?shù)字類型存在多個(gè)構(gòu)造函數(shù),直接映射到整數(shù)可能會(huì)導(dǎo)致歧義。可以定義一個(gè)具有整數(shù)屬性的類來(lái)解決這個(gè)問(wèn)題。

定義一個(gè)包裝類:

public class TrafficSignalNumber {
    private Integer number;
}

使用默認(rèn)方法將枚舉映射到整數(shù):

@Mapping(target = "number", source = ".")
TrafficSignalNumber trafficSignalToTrafficSignalNumber(TrafficSignal source);

生成的代碼是:

public TrafficSignalNumber trafficSignalToTrafficSignalNumber(TrafficSignal source) {
    if ( source == null ) {
        return null;
    }

    TrafficSignalNumber trafficSignalNumber = new TrafficSignalNumber();

    if ( source != null ) {
        trafficSignalNumber.setNumber( source.ordinal() );
    }

    return trafficSignalNumber;
}

五、處理未知枚舉值

前面提到過(guò),在處理枚舉值值,當(dāng)有未映射的枚舉值時(shí),MapStruct會(huì)拋出異常。

不過(guò),很多時(shí)候,當(dāng)映射失敗的時(shí)候,我們需要有不同的操作,比如:設(shè)置默認(rèn)值、設(shè)置空值、拋出異常等。

(一)未映射拋出異常

拋出異常是默認(rèn)行為,前面的示例中都是屬于這種類型。

(二)映射剩余屬性

比如,我們有一個(gè)簡(jiǎn)單的交通信號(hào)枚舉:

public enum SimpleTrafficSignal {
    OFF,
    ON;
}

需要將toSimpleTrafficSignal映射到SimpleTrafficSignal,但是MapStruct要求所有枚舉值都需要映射,不能遺漏,所以我們可以這樣寫:

@ValueMapping(target = "OFF", source = "OFF")
@ValueMapping(target = "OFF", source = "STOP")
@ValueMapping(target = "ON", source = "GO")
SimpleTrafficSignal toSimpleTrafficSignal(TrafficSignal source);

我們顯式地將STOP和OFF都映射到OFF,但是如果值特別多的時(shí)候,這樣寫就顯得很傻,我們可以使用ANY_REMAINING配置:

@ValueMapping(target = "ON", source = "GO")
@ValueMapping(target = "OFF", source = ANY_REMAINING)
SimpleTrafficSignal toSimpleTrafficSignalWithRemaining(TrafficSignal source);

生成的代碼是:

public SimpleTrafficSignal toSimpleTrafficSignalWithRemaining(TrafficSignal source) {
    if ( source == null ) {
        return null;
    }

    SimpleTrafficSignal simpleTrafficSignal;

    switch ( source ) {
        case GO: simpleTrafficSignal = SimpleTrafficSignal.ON;
        break;
        case OFF: simpleTrafficSignal = SimpleTrafficSignal.OFF;
        break;
        default: simpleTrafficSignal = SimpleTrafficSignal.OFF;
    }

    return simpleTrafficSignal;
}

也就是,除了GO明確映射外,其他的都映射為OFF。

(三)映射未映射的屬性

我們可以所有未映射到值全部映射為指定的枚舉,比如,所有沒(méi)有配置的都映射為OFF,我們可以使用ANY_UNMAPPED配置:

@ValueMapping(target = "ON", source = "GO")
@ValueMapping(target = "OFF", source = ANY_UNMAPPED)
SimpleTrafficSignal toSimpleTrafficSignalWithUnmapped(TrafficSignal source);

生成的代碼是:

@Override
public SimpleTrafficSignal toSimpleTrafficSignalWithUnmapped(TrafficSignal source) {
    if ( source == null ) {
        return null;
    }

    SimpleTrafficSignal simpleTrafficSignal;

    switch ( source ) {
        case GO: simpleTrafficSignal = SimpleTrafficSignal.ON;
        break;
        default: simpleTrafficSignal = SimpleTrafficSignal.OFF;
    }

    return simpleTrafficSignal;
}

(四)處理空值

MapStruct可以使用NULL關(guān)鍵字處理空的源和空的目標(biāo)。

假設(shè)我們需要將空輸入映射到OFF,將GO映射到ON,將任何其他未映射的值映射到空。

我們可以這樣定義映射:

@ValueMapping(target = "OFF", source = NULL)
@ValueMapping(target = "ON", source = "GO")
@ValueMapping(target = NULL, source = MappingConstants.ANY_UNMAPPED)
SimpleTrafficSignal toSimpleTrafficSignalWithNullHandling(TrafficSignal source);

生成代碼是:

public SimpleTrafficSignal toSimpleTrafficSignalWithNullHandling(TrafficSignal source) {
    if ( source == null ) {
        return SimpleTrafficSignal.OFF;
    }

    SimpleTrafficSignal simpleTrafficSignal;

    switch ( source ) {
        case GO: simpleTrafficSignal = SimpleTrafficSignal.ON;
        break;
        default: simpleTrafficSignal = null;
    }

    return simpleTrafficSignal;
}

(五)指定值拋出異常

還有一種場(chǎng)景,就是為空或者未映射時(shí),拋出異常,我們可以使用THROW_EXCEPTION策略:

定義映射:

@ValueMapping(target = "ON", source = "GO")
@ValueMapping(target = MappingConstants.THROW_EXCEPTION, source = MappingConstants.ANY_UNMAPPED)
@ValueMapping(target = MappingConstants.THROW_EXCEPTION, source = MappingConstants.NULL)
SimpleTrafficSignal toSimpleTrafficSignalWithExceptionHandling(TrafficSignal source);

生成的代碼是:

@Override
public SimpleTrafficSignal toSimpleTrafficSignalWithExceptionHandling(TrafficSignal source) {
    if ( source == null ) {
        throw new IllegalArgumentException( "Unexpected enum constant: " + source );
    }

    SimpleTrafficSignal simpleTrafficSignal;

    switch ( source ) {
        case GO: simpleTrafficSignal = SimpleTrafficSignal.ON;
        break;
        default: throw new IllegalArgumentException( "Unexpected enum constant: " + source );
    }

    return simpleTrafficSignal;
}

責(zé)任編輯:武曉燕 來(lái)源: 看山的小屋
相關(guān)推薦

2025-01-16 00:00:00

MapStruct映射

2023-07-07 08:17:48

2011-10-08 15:49:52

Java

2025-01-13 00:00:00

MapStruct繼承關(guān)系Java

2013-01-07 10:14:06

JavaJava枚舉

2011-10-10 17:15:52

Java

2021-09-22 12:56:19

編程技能Golang

2024-05-20 12:00:00

Python列表推導(dǎo)式

2025-01-10 00:00:00

MapStructArticlePerson

2025-01-24 00:00:00

MapStruct子類型Mapper

2017-07-24 10:15:32

2025-05-26 04:00:00

2023-05-22 08:03:28

JavaScrip枚舉定義

2020-09-10 07:00:00

人工智能AI機(jī)器學(xué)習(xí)

2025-08-18 08:26:14

2020-09-25 08:00:57

Kubernetes

2010-12-14 09:27:44

綠色網(wǎng)絡(luò)

2011-10-24 09:25:54

蘋果Siri調(diào)戲

2022-05-10 08:08:01

find命令Linux

2010-07-19 16:00:51

職場(chǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

好吊色欧美一区二区三区四区 | 国产白浆在线观看| 亚洲香蕉av| 亚洲福利视频在线| www.天天射.com| 欧美精品videosex| 久久久精品免费免费| 亚洲a级在线观看| 天天干天天干天天操| 欧美艳星介绍134位艳星| 精品久久一区二区三区| 国产九九在线观看| 日本在线影院| 夜夜亚洲天天久久| 亚洲va久久久噜噜噜久久狠狠| 丰满人妻一区二区三区无码av | 欧美在线视频免费| 好吊日在线视频| 国产成人影院| 亚洲精品720p| 99999精品| 国产精品亚洲一区二区三区在线观看 | 国产极品视频在线观看| 国产精品色在线网站| 678五月天丁香亚洲综合网| 丰满人妻中伦妇伦精品app| a视频在线观看| 中文字幕av在线一区二区三区| 国产精品一区二区三区免费| 国产毛片在线视频| 日韩激情一区二区| 欧美主播福利视频| 成年人免费看毛片| 欧美成人高清| 久久亚洲一区二区三区四区五区高 | 亚洲中文一区二区三区| 美女诱惑一区| 68精品久久久久久欧美| 久久久久久久久久久97| 伊人情人综合网| 日日噜噜噜夜夜爽亚洲精品 | 婷婷亚洲图片| 中文字幕欧美日韩va免费视频| 女~淫辱の触手3d动漫| 欧美黑人巨大videos精品| 日韩欧美在线观看一区二区三区| 激情五月俺来也| 免费一级欧美在线观看视频| 在线观看日产精品| 欧美国产日韩在线播放| 亚洲www免费| 一本到一区二区三区| 欧美黄网站在线观看| 亚洲优女在线| 一本色道久久综合亚洲精品按摩| 青青草原av在线播放| 欧美电影免费观看| 欧洲精品在线观看| 日本人视频jizz页码69| 成人免费在线观看视频| 欧美日免费三级在线| 老司机午夜性大片| 成人激情久久| 日韩亚洲欧美在线观看| 波多野吉衣在线视频| 久久久伦理片| 亚洲免费av片| 欧美88888| 伊人色**天天综合婷婷| 久久久视频精品| 少妇一级淫片免费放中国| 欧美亚洲在线| 国产精品午夜国产小视频| 一区二区三区播放| 国产超碰在线一区| 久久精品日产第一区二区三区乱码 | 久久成年人免费电影| 国产一级视频在线观看| 久久久久久网| 91久久久久久久久久| 二区三区在线视频| 91免费在线播放| 神马影院午夜我不卡| 国产人成网在线播放va免费| 亚洲国产一区视频| 欧美精品成人网| 国产精品一区二区三区www| 精品久久久久久久久久久久久久久久久 | 亚洲一区二区三区网站| 国产精品一卡二| av一区二区三区在线观看| 婷婷综合激情网| 欧美国产精品一区二区| 国产爆乳无码一区二区麻豆| 成人福利av| 日韩一区二区不卡| 少妇精品一区二区三区| 香蕉久久网站| 欧亚精品在线观看| 国产aⅴ爽av久久久久成人| 成人av午夜影院| 亚洲一区二区三区精品视频| 91超碰免费在线| 欧美男生操女生| 亚洲一区二区三区无码久久| 欧美成人直播| 欧美中文字幕在线观看| 亚洲福利在线观看视频| 国产精品午夜春色av| 国产精品专区在线| 久久丁香四色| 一区二区三区无码高清视频| 久久久久久久久久久97| 久久99精品久久只有精品| 精品一区2区三区| 亚洲第一图区| 欧美性感一区二区三区| 成人手机在线免费视频| 亚洲成人日韩| 国产精品欧美久久久| 午夜成人免费影院| 洋洋av久久久久久久一区| 中文字幕第38页| 综合干狼人综合首页| 欧美激情中文网| 国产精品老熟女视频一区二区| 久久一日本道色综合| 女人床在线观看| 国产色99精品9i| 色噜噜国产精品视频一区二区 | 久久se这里有精品| 日韩av不卡播放| 国产精品电影| 精品国产一区久久| 欧美日韩免费做爰视频| 精品一区二区国语对白| 一本久久a久久精品vr综合| 蜜桃视频成人m3u8| 亚洲欧美日韩一区在线| 国产午夜性春猛交ⅹxxx| 91丝袜高跟美女视频| 成人一区二区免费视频| 久久a爱视频| 国内精品400部情侣激情| 国产黄色一区二区| 一区二区三区日韩精品视频| 毛片毛片毛片毛片毛| 亚洲一区在线| 91九色在线观看| 手机在线免费观看av| 日韩欧美www| 久久久久久国产精品免费播放| 国产成人av一区二区| 女人被男人躁得好爽免费视频 | 久久精品国产亚洲av麻豆色欲 | sm捆绑调教国产免费网站在线观看 | 中文字幕一二三| 亚洲午夜电影| 精选一区二区三区四区五区| 国产传媒在线| 精品小视频在线| 国产免费a视频| 欧美国产日韩a欧美在线观看| 国产喷水theporn| 天天做天天爱天天综合网| 97人摸人人澡人人人超一碰| 96av在线| 一区二区三区美女xx视频| 91激情在线观看| 亚洲精品网站在线观看| 精品视频站长推荐| 水野朝阳av一区二区三区| 亚洲国产高清国产精品| 久久久久久久久久久久电影| 久久久人成影片一区二区三区观看| 亚洲AV成人无码一二三区在线| 色婷婷亚洲精品| 小早川怜子一区二区的演员表| 国产成人一区二区精品非洲| 国产淫片免费看| 久久免费大视频| http;//www.99re视频| 福利在线免费视频| 一区二区成人av| jizz中国少妇| 在线一区二区三区四区| 国产黄色的视频| 91免费观看视频在线| 污污视频网站在线| 国产精品综合| 熟妇熟女乱妇乱女网站| 欧美尿孔扩张虐视频| 国产日韩欧美日韩| h片精品在线观看| 在线日韩av观看| 狠狠人妻久久久久久综合麻豆| 91国产丝袜在线播放| 天天操天天操天天操天天操天天操| 99久久久精品| 五月天视频在线观看| 国产精品女主播一区二区三区| 中文字幕乱码一区二区三区| 日韩极品在线| 97视频资源在线观看| www.久久.com| 性欧美暴力猛交69hd| 乱人伦中文视频在线| 亚洲人成电影在线| 空姐吹箫视频大全| 69精品人人人人| 国产精品无码粉嫩小泬| 精品福利免费观看| 久久婷婷综合国产| 国产精品麻豆欧美日韩ww| 亚洲最大的黄色网| 国产成人免费视频一区| the porn av| 免费欧美在线| 久艹视频在线免费观看| 欧美日韩亚洲一区二区三区在线| 在线成人性视频| 日韩国产在线| 日韩欧美精品久久| 亚洲日产av中文字幕| 精品国产免费久久久久久尖叫 | 久久精品欧美一区二区| 亚洲欧美综合色| 国产精品成人在线视频| 久久久久久久久久久99999| 国产极品一区二区| 国产不卡视频一区二区三区| 永久av免费在线观看| 久久爱www久久做| 日韩在线不卡一区| 久久精品国产精品青草| 一区二区三区 欧美| 日本不卡一区二区三区高清视频| 无遮挡又爽又刺激的视频 | 青草热久免费精品视频 | 精品96久久久久久中文字幕无| 中文字幕中文字幕99| 日韩精品电影| 亚洲精品久久久久久一区二区| 国产91一区| 精品久久久久久久久久久久包黑料| 又色又爽又黄无遮挡的免费视频| 在线视频国产一区| 波多野结衣在线观看视频| 色婷婷av一区二区三区软件| 国产性生活视频| 欧美在线综合视频| 影音先锋国产在线| 欧美日本高清视频在线观看| 国产一区二区三区黄片| 777精品伊人久久久久大香线蕉| 一级特黄aaaaaa大片| 9191久久久久久久久久久| 国产又大又长又粗| 日韩一级免费观看| 亚洲精品久久久久久无码色欲四季| 精品国产乱码久久久久久久| 午夜视频在线播放| 亚洲精品一区中文| av天在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 2024短剧网剧在线观看| 久久久噜噜噜久噜久久| 一本大道色婷婷在线| 国产精品嫩草视频| 一级毛片精品毛片| 久久96国产精品久久99软件| 国产精品亚洲二区| 亚洲一区二区自拍偷拍| 欧美精品观看| 亚洲自偷自拍熟女另类| 青青草成人在线观看| 老司机av网站| 久久久久久久久久久久久久久99 | 国产成人精品免费视频大全最热| 全球av集中精品导航福利| 色一情一乱一伦一区二区三区 | 亚洲午夜精品一区 二区 三区| 国产一区二区四区| 日韩激情一二三区| 色诱av手机版| 久久九九全国免费| www.99re7| 色呦呦网站一区| aaaa一级片| 亚洲奶大毛多的老太婆| 成年人网站在线| 国产成人欧美在线观看| 精品国产不卡一区二区| 欧美成ee人免费视频| 欧美日本在线| 亚洲国产精品三区| 成人看片黄a免费看在线| 一区二区三区在线播放视频| 精品高清美女精品国产区| 中文字幕在线2019| 日韩毛片中文字幕| 在线观看三级视频| 国产精品日韩欧美大师| 老牛精品亚洲成av人片| 大地资源第二页在线观看高清版| 久久亚洲风情| www.男人天堂| 樱花草国产18久久久久| 中文字幕有码视频| 亚洲欧美中文日韩v在线观看| 日本在线视频中文有码| 国产一区二区丝袜| 精品一区三区| aa在线观看视频| 国产成a人无v码亚洲福利| 91嫩草丨国产丨精品| 欧美日韩视频第一区| 美国一级片在线免费观看视频| 高清一区二区三区日本久| 久久久久亚洲精品中文字幕| 亚洲黄色成人久久久| 日韩国产欧美三级| 无码国产精品一区二区免费式直播| 亚洲少妇中出一区| 亚洲网站免费观看| 中文字幕日韩精品在线观看| 欧美性xxx| 鲁丝片一区二区三区| 亚洲精品123区| 农村末发育av片一区二区| 亚洲美女屁股眼交3| 国产精品毛片久久久久久久av| 在线观看视频亚洲| 日韩精品一区二区三区av| 欧美最大成人综合网| 六月婷婷一区| 人妻av无码一区二区三区| 色综合久久天天| 精品电影在线| 国产91露脸中文字幕在线| 要久久爱电视剧全集完整观看| a级黄色一级片| 91片黄在线观看| 亚洲国产av一区二区三区| 亚洲午夜未删减在线观看| 另类中文字幕国产精品| 亚洲二区自拍| 狠狠狠色丁香婷婷综合激情| 婷婷社区五月天| 精品少妇一区二区三区日产乱码| 久久亚洲资源| 国产一区在线免费观看| 久久精品一区| 山东少妇露脸刺激对白在线| 精品视频123区在线观看| 日本视频在线免费观看| 亚洲xxx自由成熟| 影音先锋久久精品| 欧美 日本 国产| 欧美四级电影在线观看| 麻豆视频在线播放| 99久久伊人精品影院| 日韩视频一区| 日本美女xxx| 欧美一区二区视频在线观看2022 | 国产精品久久久久久久美男| 久久在线视频免费观看| 男人女人拔萝卜视频| 天天色图综合网| 91这里只有精品| 99久久无色码| 久久亚洲欧美| 丝袜美腿小色网| 亚洲激情视频在线播放| 成人午夜一级| 日韩黄色片在线| 国产日韩欧美a| 国产ts人妖调教重口男| 538国产精品一区二区免费视频| 欧洲福利电影| 深夜视频在线观看| 色呦呦一区二区三区| 污视频在线免费观看网站| 免费成人av网站| 国产资源精品在线观看| 国产69精品久久久久久久久久| 中文字幕欧美精品日韩中文字幕| 999久久久精品一区二区| 麻豆一区二区三区视频| 亚洲一二三四在线| 高清福利在线观看| 国产精品裸体一区二区三区| 日韩av一区二| 精品一区在线视频| 最好看的2019年中文视频| 欧美a大片欧美片| 91在线第一页| 在线观看不卡一区| 国产理论在线| 国产一级大片免费看|