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

Groovy 類型檢查擴(kuò)展,使用擴(kuò)展

開(kāi)發(fā) 前端
要獲得helper方法的完整列表,請(qǐng)參考類org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport和類org.codehaus.groovy.transform.stc.TypeCheckingExtension。

1. 介紹

在上一篇介紹了基本的Groovy的類型檢查擴(kuò)展,以及該擴(kuò)展的意義和部分的API說(shuō)明。

本篇接著上篇沒(méi)有講完的內(nèi)容,繼續(xù)介紹類型檢查擴(kuò)展的相關(guān)知識(shí)點(diǎn)。

2. 使用類型檢查擴(kuò)展

我們講解了如何創(chuàng)建類型檢查擴(kuò)展,這里開(kāi)始講解各種的使用方式。

2.1 支持類-Support classes

DSL依賴于一個(gè)名為org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport的支持類。這個(gè)類本身擴(kuò)展了org.codehaus.groovy.transform.stc.TypeCheckingExtension。這兩個(gè)類定義了許多幫助器方法,使使用AST變得更容易,特別是在類型檢查方面。要知道的一件有趣的事情是,我們可以訪問(wèn)類型檢查器。這意味著我們可以以編程方式調(diào)用類型檢查器的方法,包括那些允許拋出編譯錯(cuò)誤的方法。

擴(kuò)展腳本委托給org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport類,這意味著我們可以直接訪問(wèn)以下變量:

  • context:類型檢查器上下文,類型為org.codehaus.groovy.transform.stc.TypeCheckingContext
  • typeCheckingVisitor:類型檢查器本身,一個(gè)org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor實(shí)例
  • generatedMethods:一個(gè)“生成方法”的列表,這實(shí)際上是一個(gè)“dummy”方法的列表,你可以使用newMethod調(diào)用在一個(gè)類型檢查擴(kuò)展中創(chuàng)建。

類型檢查上下文包含大量在上下文中對(duì)類型檢查器有用的信息。例如,當(dāng)前的封閉方法調(diào)用堆棧、二進(jìn)制表達(dá)式、閉包等等,如果我們必須知道錯(cuò)誤發(fā)生時(shí)我們?cè)谀睦镆约拔覀兿胍幚硭敲催@些信息就特別重要。

除了GroovyTypeCheckingExtensionSupport和StaticTypeCheckingVisitor提供的功能外,類型檢查DSL腳本還從org.codehaus.groovy.ast.ClassHelper和org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport導(dǎo)入靜態(tài)成員,允許通過(guò)OBJECT_TYPE、STRING_TYPE、THROWABLE_TYPE等對(duì)公共類型進(jìn)行訪問(wèn),并檢查諸如missesgenericsttypes(ClassNode)、isClassClassNodeWrappingConcreteType(ClassNode)等。

2.2 類節(jié)點(diǎn)-Class nodes

在使用類型檢查擴(kuò)展時(shí),需要特別注意處理類節(jié)點(diǎn)。編譯使用抽象語(yǔ)法樹(shù)(AST),當(dāng)您檢查類的類型時(shí),該樹(shù)可能不完整。這也意味著在引用類型時(shí),不能使用String或HashSet等類字面量,而是使用表示這些類型的類節(jié)點(diǎn)。這需要一定程度的抽象和理解Groovy如何處理類節(jié)點(diǎn)。為了簡(jiǎn)化工作,Groovy提供了幾個(gè)輔助方法來(lái)處理類節(jié)點(diǎn)。例如,如果你想說(shuō)“String的類型”,你可以這樣寫(xiě):

assert classNodeFor(String) instanceof ClassNode

還會(huì)注意到,classNodeFor有一個(gè)變體,它以String而不是Class作為參數(shù)。一般來(lái)說(shuō),我們不應(yīng)該使用該方法,因?yàn)樗鼘?chuàng)建一個(gè)名稱為String的類節(jié)點(diǎn),但沒(méi)有在其上定義任何方法、任何屬性等。第一個(gè)版本返回已解析的類節(jié)點(diǎn),而第二個(gè)版本返回未解析的類節(jié)點(diǎn)。所以后者應(yīng)該留給非常特殊的情況。

可能遇到的第二個(gè)問(wèn)題是引用一個(gè)尚未編譯的類型。這種情況發(fā)生的頻率可能比你想象的要高。例如,當(dāng)一起編譯一組文件時(shí)。在這種情況下,如果你想說(shuō)“那個(gè)變量是Foo類型的”,但Foo還沒(méi)有編譯,仍然可以使用lookupClassNodeFor引用Foo類節(jié)點(diǎn):

assert lookupClassNodeFor('Foo') instanceof ClassNode

2.3 類型檢查器的幫助

假設(shè)你知道變量foo的類型是Foo,你想告訴類型檢查器。然后可以使用storeType方法,該方法接受兩個(gè)參數(shù):第一個(gè)參數(shù)是希望存儲(chǔ)類型的節(jié)點(diǎn),第二個(gè)參數(shù)是節(jié)點(diǎn)的類型。如果查看storeType的實(shí)現(xiàn),我們將看到它委托給類型檢查器等效方法,該方法本身做了大量工作來(lái)存儲(chǔ)節(jié)點(diǎn)元數(shù)據(jù)。還將看到,存儲(chǔ)類型并不局限于變量:可以設(shè)置任何表達(dá)式的類型。

同樣,獲取AST節(jié)點(diǎn)的類型只需調(diào)用該節(jié)點(diǎn)上的getType即可。這通常是你想要的,但有一些注意事項(xiàng):

  1. getType返回一個(gè)表達(dá)式的推斷類型。這意味著對(duì)于聲明為Object類型的變量,它不會(huì)返回Object的類節(jié)點(diǎn),而是在代碼的這一點(diǎn)返回該變量的推斷類型(流類型)。
  2. 如果想訪問(wèn)變量(或字段/參數(shù))的原始類型,那么必須在AST節(jié)點(diǎn)上調(diào)用適當(dāng)?shù)姆椒ā?/li>

2.4 拋出錯(cuò)誤

要拋出一個(gè)類型檢查錯(cuò)誤,你只需要調(diào)用addStaticTypeError方法,它有兩個(gè)參數(shù):

  • 將顯示給最終用戶的字符串形式的消息
  • 負(fù)責(zé)錯(cuò)誤的AST節(jié)點(diǎn)。最好提供最合適的AST節(jié)點(diǎn),因?yàn)樗鼘⒂糜跈z索行號(hào)和列號(hào)

2.5 isXXXExpression表達(dá)式

通常需要知道AST節(jié)點(diǎn)的類型。為了可讀性DSL提供了一個(gè)特殊的isXXXExpression方法,該方法將委托給XXXExpression的x實(shí)例。例如:

不建議的寫(xiě)法:

if (node instanceof BinaryExpression) {
...
}

正確,推薦的寫(xiě)法:

if (isBinaryExpression(node)) {   ... }

2.6 虛擬方法-Virtual methods

當(dāng)我們執(zhí)行動(dòng)態(tài)代碼的類型檢查時(shí),可能經(jīng)常會(huì)遇到這樣的情況:知道一個(gè)方法調(diào)用是有效的,但它背后并沒(méi)有“真正的”方法。

以Grails動(dòng)態(tài)查找器為例。可以有一個(gè)由名為findByName(…)的方法組成的方法調(diào)用。

由于bean中沒(méi)有定義findByName方法,類型檢查器會(huì)報(bào)錯(cuò)。

但是,我們知道這個(gè)方法在運(yùn)行時(shí)不會(huì)失敗,甚至可以知道這個(gè)方法的返回類型是什么。

對(duì)于這種情況,DSL支持由虛擬方法組成的兩個(gè)特殊構(gòu)造。這意味著將返回一個(gè)實(shí)際上并不存在但在類型檢查上下文中定義的方法節(jié)點(diǎn)。有三種方法:

  • newMethod(String name, Class returnType)
  • newMethod(String name, ClassNode returnType)
  • newMethod(String name, Callable<ClassNode> return Type)

所有這三個(gè)方法都做同樣的事情:它們創(chuàng)建一個(gè)新的方法節(jié)點(diǎn),其名稱是提供的名稱,并定義該方法的返回類型。

此外,類型檢查器會(huì)將這些方法添加到generatedMethods列表中。我們只設(shè)置名稱和返回類型的原因是,這是在90%的情況下所需要的。

例如,在上面的findByName示例中,只需要知道findByName不會(huì)在運(yùn)行時(shí)失敗,并且它返回一個(gè)域類。

返回類型的Callable版本很有趣,因?yàn)楫?dāng)類型檢查器實(shí)際需要返回類型時(shí),它推遲了返回類型的計(jì)算。

在某些情況下,當(dāng)類型檢查器要求返回類型時(shí),可能不知道實(shí)際的返回類型,因此可以使用閉包,每當(dāng)類型檢查器在此方法節(jié)點(diǎn)上調(diào)用getReturnType時(shí),都會(huì)調(diào)用閉包。

如果將此與延遲檢查結(jié)合起來(lái),就可以實(shí)現(xiàn)相當(dāng)復(fù)雜的類型檢查,包括前向引用的處理。

newMethod(name) {
//每次調(diào)用這個(gè)方法節(jié)點(diǎn)上的getReturnType時(shí),這個(gè)閉包就會(huì)被調(diào)用!
println 'Type checker called me!'
lookupClassNodeFor(Foo) //返回類型
}

如果你需要的不僅僅是名稱和返回類型,你可以自己創(chuàng)建一個(gè)新的MethodNode。

2.7 范圍-Scoping

范圍在DSL類型檢查中非常重要,這也是為什么我們不能使用基于切入點(diǎn)的方法來(lái)進(jìn)行DSL類型檢查的原因之一。

基本上,必須能夠非常精確地定義何時(shí)應(yīng)用擴(kuò)展,何時(shí)不應(yīng)用擴(kuò)展。此外,必須能夠處理常規(guī)類型檢查器無(wú)法處理的情況,例如前向引用:

point a(1,1)
line a,b // b是事后引用的!
point b(5,2)

例如,你想處理一個(gè)構(gòu)建器:

builder.foo {
bar
baz(bar)
}

因此,我們的擴(kuò)展應(yīng)該只在輸入foo方法時(shí)是活動(dòng)的,并且在此范圍之外是不活動(dòng)的。

但是,可能會(huì)遇到復(fù)雜的情況,比如同一個(gè)文件中有多個(gè)構(gòu)建程序或嵌入式構(gòu)建程序(構(gòu)建程序中的構(gòu)建程序)。

雖然不應(yīng)該嘗試從一開(kāi)始就修復(fù)所有這些問(wèn)題(必須接受類型檢查的限制),但類型檢查器確實(shí)提供了一種很好的機(jī)制來(lái)處理這個(gè)問(wèn)題:使用newScope和scopeExit方法的作用域堆棧。

  • newScope :創(chuàng)建一個(gè)新的作用域并將其放在堆棧頂部
  • scopeExits :從堆棧中彈出作用域

范圍包括:

  • 父作用域
  • 自定義數(shù)據(jù)的Map

如果想看一下實(shí)現(xiàn),它只是一個(gè)LinkedHashMap (org.codehaus.groovytypecheckingextensionsupport.typecheckingscope),但是它非常強(qiáng)大。例如,可以使用這樣的作用域來(lái)存儲(chǔ)退出作用域時(shí)要執(zhí)行的閉包列表。這是處理前向引用的方式:

def scope = newScope()
scope.secondPassChecks = []
//...
scope.secondPassChecks << { println 'executed later' }
// ...
scopeExit {
secondPassChecks*.run() // 執(zhí)行延遲檢查
}

也就是說(shuō),如果在某個(gè)時(shí)候無(wú)法確定表達(dá)式的類型,或者此時(shí)無(wú)法檢查賦值是否有效,仍然可以稍后進(jìn)行檢查……這是一個(gè)非常強(qiáng)大的功能。

現(xiàn)在,newScope和scopeExit提供了一些有趣的語(yǔ)法糖:

newScope {
secondPassChecks = []
}

在DSL中的任何時(shí)候,都可以使用getCurrentScope()或更簡(jiǎn)單的currentScope訪問(wèn)當(dāng)前作用域:

//...
currentScope.secondPassChecks << { println 'executed later' }
// ...

一般的模式是:

  • 確定將新作用域推入堆棧的切入點(diǎn),并在此作用域中初始化自定義變量
  • 使用各種事件,可以使用存儲(chǔ)在自定義范圍中的信息來(lái)執(zhí)行檢查、延遲檢查……
  • 確定退出范圍的切入點(diǎn),調(diào)用scopeExit并最終執(zhí)行額外的檢查

2.8 其他有用的方法

要獲得helper方法的完整列表,請(qǐng)參考類org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport和類org.codehaus.groovy.transform.stc.TypeCheckingExtension。但是,要特別注意以下方法:

  • isDynamic: 接受VariableExpression作為參數(shù),如果變量是DynamicExpression則返回true,這意味著在腳本中,它不是使用類型或def定義的。
  • isGenerated:接受MethodNode作為參數(shù),并告知該方法是否是由類型檢查器擴(kuò)展使用newMethod 方法生成的方法
  • isAnnotatedBy: 接受一個(gè)AST節(jié)點(diǎn)和一個(gè)類(或ClassNode),并告知該節(jié)點(diǎn)是否用這個(gè)類標(biāo)注。例如: isAnnotatedBy(node, NotNull)
  • getTargetMethod: 接受一個(gè)方法調(diào)用作為參數(shù),并返回類型檢查器為其確定的 MethodNode
  • delegatesTo: 模擬@DelegatesTo注解的行為。它允許我們判斷參數(shù)將委托給特定類型(也可以指定委托策略)

3. 小結(jié)

關(guān)于類型檢測(cè)擴(kuò)展的使用相關(guān)知識(shí)要點(diǎn),就介紹到這里了。以上相關(guān)內(nèi)容可以參考Groovy官方文檔:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#Typecheckingextensions-Workingwithextensions進(jìn)行查詢。

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

2023-01-05 08:09:27

GroovyDSL?

2022-01-10 10:48:34

SorbetVS CodeRuby

2012-07-02 10:43:49

JVMGroovyJava

2012-07-12 11:23:07

GroovyJVM

2009-09-10 16:32:19

LINQ Where

2015-04-20 10:06:37

PHP Rust 創(chuàng)建PHP 擴(kuò)展

2020-11-27 20:02:17

LVM邏輯卷管理器

2024-07-01 12:13:44

2011-12-26 10:49:27

JavaJUnitRunner

2009-08-27 18:04:01

c#擴(kuò)展方法string

2023-09-27 11:39:07

GNOMELinux

2021-11-29 10:24:56

WasmEnvoy 負(fù)載均衡

2023-12-12 07:30:54

IstioWasm前端

2009-12-04 15:43:03

PHP JSON擴(kuò)展

2011-12-26 10:38:28

JavaJUnitRule

2022-06-20 14:59:14

讀寫(xiě)分離模Loki

2009-08-13 18:00:48

Eclipse重構(gòu)功能擴(kuò)展點(diǎn)

2010-06-30 17:15:39

向外擴(kuò)展SQL Ser

2009-03-16 09:16:13

行為擴(kuò)展WCF.NET

2009-08-31 14:45:10

C#擴(kuò)展方法
點(diǎn)贊
收藏

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

国产在线精品播放| 北条麻妃一区二区三区中文字幕| 国产视频一视频二| 娇妻被老王脔到高潮失禁视频| 日韩成人影音| 亚洲精品中文在线影院| 久久国产日韩欧美| 一级片一区二区三区| 婷婷亚洲精品| 亚洲综合免费观看高清完整版在线 | 亚洲福利在线看| 一区二区三区国| 色综合视频在线| 久久激情五月婷婷| 91精品国产乱码久久久久久蜜臀| 欧美成人短视频| 日韩手机在线| 欧美成人精品高清在线播放| 国产日韩成人内射视频| 青青久在线视频免费观看| 久久福利资源站| 日本欧美一级片| 免费在线一区二区三区| 国产不卡精品| 亚洲三级电影网站| 成人黄色影片在线| 日本熟女毛茸茸| 国产精品www994| 综合136福利视频在线| 天天操天天爱天天爽| 91探花在线观看| 一区二区三区中文字幕精品精品 | 成人春色激情网| 久久精品偷拍视频| 99精品热视频只有精品10| 日韩免费观看高清完整版 | heyzo一本久久综合| 亚洲aa在线观看| 91麻豆成人精品国产免费网站| 午夜在线精品| 欧美亚洲国产成人精品| 国产精品suv一区二区69| 欧美在线免费| 欧美大片一区二区| 中文字幕第三区| 四虎国产精品永久在线国在线| 亚洲欧洲日韩一区二区三区| 亚洲成人蜜桃| 中文字幕在线观看日本| 中文字幕免费在线观看视频一区| 国产一区深夜福利| 中文字幕免费播放| 日本成人在线一区| 国产精品久久久久久av下载红粉 | 亚洲在线观看| 茄子视频成人在线| 国产精品免费精品一区| 久久久国产精品一区二区中文| 2019最新中文字幕| 黄色片视频免费| 日韩极品在线观看| 国产精品一区二区久久久久| 一区二区精品视频在线观看| 激情综合网天天干| 91在线播放视频| 国产精品久久久久久99| 国产亚洲高清视频| 欧美中文字幕在线观看| 久久国产黄色片| 久久人人精品| 欧美精品videofree1080p| 国产大片中文字幕在线观看| 国产日韩1区| 国产不卡在线观看| 97超视频在线观看| 国产精品888| 久久国产精品一区二区三区| 黄色在线小视频| 成人一级片网址| 免费看成人午夜电影| 成人午夜影视| 亚洲精品免费一二三区| 亚洲 自拍 另类小说综合图区| 成人福利视频| 91精品国产综合久久久久久久| 精品人妻在线视频| 综合亚洲色图| 欧美精品日韩三级| 超碰超碰超碰超碰| 麻豆精品在线观看| 国产一区免费在线观看| а天堂8中文最新版在线官网| 亚洲精品伦理在线| 亚洲一区二区三区四区五区xx| 国产视频一区二| 亚洲欧美制服丝袜| 欧美三根一起进三p| 久久久精品午夜少妇| 97自拍视频| 99re在线视频| 午夜电影一区二区三区| 色噜噜狠狠一区二区三区狼国成人| 精品女人视频| 久久久国产91| 波多野结衣绝顶大高潮| 岛国精品在线播放| 国产对白在线播放| 成人在线黄色| 亚洲免费成人av电影| 免费在线观看av网址| 蜜桃av一区二区| 久久精品国产美女| 91短视频版在线观看www免费| 亚洲一区二三区| 亚洲综合婷婷久久| 鲁大师精品99久久久| 中文字幕免费精品一区高清| 国产无遮挡裸体免费视频| 奇米色777欧美一区二区| 久久久久久久久久码影片| 老司机午夜在线视频| 色一情一伦一子一伦一区| 九色91porny| 成人在线免费观看91| 九九热这里只有精品6| 一本色道久久综合亚洲| 91丨九色丨国产丨porny| 最新中文字幕久久| 欧美亚洲韩国| 亚洲第一区中文99精品| 中文天堂资源在线| 夜夜精品视频| y111111国产精品久久婷婷| 91在线观看| 一本一道综合狠狠老| 久久黄色一级视频| 成人国产精品一级毛片视频| 欧美资源在线观看| 天堂在线视频免费| 亚洲综合成人在线| 免费看91视频| 亚洲精品888| 国产欧洲精品视频| 国产在线色视频| 欧美日韩国产精品专区 | 在线中文字幕播放| 精品国产1区二区| 欧美成人片在线观看| 国产中文字幕精品| 青青草原国产免费| 亚洲电影有码| 在线观看日韩欧美| 欧美黄色一级大片| 久久久久久久久免费| 男人操女人免费软件| 欧美人成在线观看ccc36| 欧美va亚洲va香蕉在线| 外国一级黄色片| 国内不卡的二区三区中文字幕| a级网站在线观看| 国产精品xnxxcom| 日韩在线不卡视频| 国产在成人精品线拍偷自揄拍| 中文字幕一区日韩精品欧美| 久久久国产欧美| 神马电影久久| 国产视频观看一区| 欧美18hd| 日韩一区二区电影网| 麻豆视频在线观看| 成人中文字幕合集| 99免费视频观看| 97视频热人人精品免费| 91最新国产视频| 天使と恶魔の榨精在线播放| 欧美成人精品福利| 99热这里只有精品4| 国产91综合网| 青青草国产精品视频| 日韩欧美影院| 国产精品流白浆视频| 蜜桃av在线免费观看| 日韩亚洲欧美成人一区| 国产系列精品av| 久久久久国产精品厨房| 色婷婷成人在线| 国产精品草草| 色综合久久av| 日韩精品一区二区三区中文字幕| 欧美俄罗斯性视频| 男人天堂亚洲二区| 欧美日韩国产美女| 精品深夜av无码一区二区老年| 国产日韩欧美精品一区| 国产黑丝在线视频| 国产乱码精品| 精品久久免费观看| 久久精品色播| 日韩美女毛茸茸| 国产理论电影在线| 亚洲视频在线观看| 精品国产99久久久久久宅男i| 午夜精品一区二区三区免费视频| 欧美丰满美乳xxⅹ高潮www| 激情久久久久久久久久久久久久久久| 丰满爆乳一区二区三区| 色135综合网| 国产精品午夜av在线| 欧美123区| 欧美精品久久久久久久| 黄色美女网站在线观看| 亚洲精品国产综合久久| 91激情在线观看| 欧美日韩免费区域视频在线观看| 国产一二三av| 久久影院视频免费| 中国极品少妇xxxx| 久久99热99| 黄色片久久久久| 亚洲天堂偷拍| 久久精品国产精品亚洲精品色| 欧美三级自拍| 99视频在线| 亚洲色图综合| 国产精品a久久久久久| yellow字幕网在线| 日韩中文字幕av| www.国产精品.com| 亚洲精选中文字幕| 日本高清视频免费观看| 91精品国产一区二区| 人人妻人人爽人人澡人人精品| 欧美网站在线观看| 久久网一区二区| 国产精品成人免费精品自在线观看| 国产精品久久无码| 丁香激情综合国产| 麻豆精品国产传媒| 国产伦精一区二区三区| 50路60路老熟妇啪啪| 亚洲欧美日韩视频二区| 99色这里只有精品| 韩日成人av| 男同互操gay射视频在线看| 亚洲高清资源在线观看| 亚洲欧美一区二区原创| 精品国产午夜| 欧美一区二区在线视频观看| 国产精品一国产精品| 久久青青草综合| 美女呻吟一区| 精品国产一区二区三| 91九色鹿精品国产综合久久香蕉| 久久手机免费视频| 日本美女在线中文版| 日韩中文综合网| 日本视频在线免费观看| 日韩网站在线观看| jizz性欧美10| 欧美激情a在线| 欧美6一10sex性hd| 欧美精品久久久久| 麻豆理论在线观看| 97精品国产97久久久久久| 密臀av在线播放| 欧美做受高潮1| 欧美舌奴丨vk视频| 国产精品永久免费视频| 亚洲精品一区在线| 精品国产一区二区三区四区vr| 欧美一性一交| 欧美一区二区三区精美影视 | 成人性生交大片免费看在线播放| 久精品免费视频| 91白丝在线| 国产精品黄页免费高清在线观看| 一区在线影院| 亚洲在线www| 丁香婷婷成人| 免费av一区二区三区| 欧美日韩一本| 伊人天天久久大香线蕉av色| 亚洲国产一区二区三区在线播放| 草草视频在线免费观看| 精品久久久亚洲| 亚洲午夜激情| 日韩网站在线| 在线免费视频a| 国产乱码精品1区2区3区| 97人妻天天摸天天爽天天| 久久久久久久久一| 久久精品www| 一本久道中文字幕精品亚洲嫩| 亚洲一区在线观| 亚洲精品一线二线三线无人区| av成人手机在线| 久久久爽爽爽美女图片| 亚洲一区二区三区四区| 91成人免费观看| 日韩三级av| 欧美交换配乱吟粗大25p| 久久人人99| 成人一区二区免费视频| 日韩一区精品字幕| 久久人妻一区二区| 国产精品久久久久三级| 欧美一区二区三区成人精品| 中文字幕在线观看一区| 九九热在线视频播放| 欧美一区二区精美| 加勒比一区二区三区在线| 久久视频在线视频| 精品免费av在线| 99精品99久久久久久宅男| 精品高清久久| 国产中文字幕二区| 国产一区二区三区在线观看精品| 国产精品久久免费观看| 亚洲国产精品嫩草影院| 97精品久久人人爽人人爽| 国产视频精品va久久久久久| 日韩激情av| 成人av在线亚洲| 欧美日韩有码| av动漫在线观看| 国产精品一区在线观看乱码| 国产综合精品久久久久成人av| 精品国产91久久久久久老师| 午夜精品久久久久久久99热黄桃| 日韩在线观看网站| 精品国模一区二区三区| 国产精品一区视频| 最新国产精品| 野花视频免费在线观看| 中文字幕在线观看不卡视频| 日韩不卡高清视频| 亚洲男人的天堂网站| 一区二区乱码| 久久国产一区二区| 日韩视频中文| 手机在线成人av| 欧美日韩激情美女| 日韩永久免费视频| 欧美精品激情在线观看| 亚洲国产aⅴ精品一区二区| 久久久国内精品| 国产精品99精品久久免费| 亚洲熟女www一区二区三区| 欧美日韩成人激情| bestiality新另类大全| 亚洲va久久久噜噜噜久久天堂| 久久在线视频| 色婷婷激情视频| 亚洲综合成人在线| 二区三区在线视频| 久久久在线视频| 午夜视频一区二区在线观看| 欧美亚洲日本一区二区三区| 成人av资源网站| 天天干天天干天天干天天| 亚洲国产精品久久久久| bl视频在线免费观看| 久久资源亚洲| 老司机精品久久| 蜜桃视频最新网址| 欧美一区二区三区四区五区 | 尤蜜粉嫩av国产一区二区三区| 国产日韩欧美精品在线| 91精品国产乱码久久久久| 欧美日韩第一页| 美国成人xxx| 国产性xxxx18免费观看视频| 久久精品一区四区| 99精品国产99久久久久久97| 欧美放荡办公室videos4k| 日韩av三区| 久久久噜噜噜www成人网| 国产精品久久久久影院老司| av免费在线观看不卡| 久久久免费观看视频| 六月丁香久久丫| 韩国中文字幕av| 亚洲女同女同女同女同女同69| jlzzjlzz亚洲女人18| 青草青草久热精品视频在线网站| 日韩av在线中文字幕| 国产精品熟女一区二区不卡| 香蕉成人伊视频在线观看| 成人p站proumb入口| 91在线网站视频| 国产精品普通话对白| 国产精品视频看看| 亚洲第一视频网| 国产韩日精品| 精品欧美一区免费观看α√| 国产欧美精品一区二区色综合朱莉| 国产三级视频在线播放| 97香蕉久久超级碰碰高清版| 亚洲二区三区不卡| 中文字幕日韩三级片|