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

Groovy 語法類型知識詳解最終篇

開發 前端
本篇是Typing相關知識的最后一篇。介紹關于類型的閉包和類型推斷關系,以及最終的類型靜態編譯相關知識點。

1. 介紹

本篇是Typing相關知識的最后一篇。介紹關于類型的閉包和類型推斷關系,以及最終的類型靜態編譯相關知識點。

2. 閉包和類型推斷

類型檢查器對閉包執行特殊的推斷,在一邊執行額外的檢查,在另一邊提高流暢性。

2.1 返回類型推斷

類型檢查器能夠做的第一件事是推斷閉包的返回類型。下面的例子簡單地說明了這一點:

@groovy.transform.TypeChecked
int testClosureReturnTypeInference(String arg) {
def cl = { "Arg: $arg" } //定義一個閉包,它返回一個GString字符串
def val = cl() //調用閉包并將結果賦值給一個變量
val.length() //類型檢查器推斷閉包將返回一個字符串,因此允許調用length()
}

正如上面所看到的,與顯式聲明其返回類型的方法不同,不需要聲明閉包的返回類型:它的類型是從閉包的主體推斷出來的。

2.2 閉包vs方法

返回類型推斷僅適用于閉包。雖然類型檢查器可以對方法執行相同的操作,但實際上并不可取:通常情況下,方法可以被覆蓋,并且靜態地不可能確保所調用的方法不是被覆蓋的版本。所以流類型實際上會認為一個方法返回一些東西,而在現實中,它可以返回其他東西,如下面的例子所示:

@TypeChecked
class A {
def compute() { 'some string' } //類A定義了一個方法compute,它返回一個字符串
def computeFully() {
compute().toUpperCase() //這將導致編譯失敗,因為compute的返回類型是def(又名Object)
}
}
@TypeChecked
class B extends A {
def compute() { 123 } //類B擴展了A并重新定義了compute,該類型返回一個整型
}

通過上面的示例可以知道,如果類型檢查器依賴于方法的推斷返回類型(使用流類型),則類型檢查器可以確定是否可以調用toUpperCase?。這實際上是一個錯誤,因為子類可以重寫compute?并返回不同的對象。這里,B.compute?返回一個整型,因此在B?的實例上調用computeFully將會看到一個運行時錯誤。編譯器通過使用方法的聲明返回類型而不是推斷返回類型來防止這種情況發生。

為了保持一致性,這種行為對于每個方法都是相同的,即使它們是靜態的或最終的。

2.3 參數類型推斷

除了返回類型外,閉包還可以從上下文推斷其參數類型。編譯器有兩種方法來推斷形參類型:

  • 通過隱式SAM類型強制
  • 通過API元數據

讓我們從一個由于類型檢查器無法推斷形參類型而導致編譯失敗的示例開始:

class Person {
String name
int age
}

void inviteIf(Person p, Closure<Boolean> predicate) { //inviteIf方法接受一個Person和一個閉包
if (predicate.call(p)) {
// send invite
// ...
}
}

@groovy.transform.TypeChecked
void failCompilation() {
Person p = new Person(name: 'Gerard', age: 55)
inviteIf(p) {
it.age >= 18 // No such property: age 它并不是靜態地稱為Person,因此編譯失敗
}
}

在這個例子中,閉包體包含了it.age?。對于動態的、非類型檢查的代碼,這是可行的,因為它的類型在運行時是Person?。不幸的是,在編譯時,沒有辦法知道它的類型,只能通過讀取inviteIf的簽名。

2.3.1 顯式閉包參數

簡而言之,類型檢查器在inviteIf?方法上沒有足夠的上下文信息來靜態確定it的類型。這意味著方法調用需要像這樣重寫:

inviteIf(p) { Person it ->          //它的類型需要顯式地聲明                        
it.age >= 18
}

通過顯式聲明it變量的類型,可以解決這個問題,并使此代碼進行靜態檢查。

2.3.2 從單一抽象方法類型推斷出的參數

對于API或框架設計人員來說,有兩種方法可以使其對用戶來說更優雅,這樣他們就不必為閉包參數聲明顯式類型。第一個方法,也是最簡單的方法,是用SAM類型替換閉包:

interface Predicate<On> { boolean apply(On e) }  //使用apply方法聲明SAM接口              

void inviteIf(Person p, Predicate<Person> predicate) {
if (predicate.apply(p)) {
// send invite
// ...
}
}

@groovy.transform.TypeChecked
void passesCompilation() {
Person p = new Person(name: 'Gerard', age: 55)

inviteIf(p) { //不再需要聲明it變量的類型了
it.age >= 18 //it.age正確編譯后,它的類型是從Predicate#apply方法簽名推斷出來的
}
}

通過使用這種技術,我們利用了Groovy將閉包自動強制轉換為SAM類型的特性。

我們應該使用SAM類型還是Closure的問題實際上取決于需要做什么。

在很多情況下,使用SAM接口就足夠了,特別是當考慮Java 8中的功能接口時。

但是,閉包提供了功能接口無法訪問的特性。特別是,閉包可以有一個委托和所有者,并且可以在被調用之前作為對象進行操作(例如,克隆、序列化、curry等等)。它們還可以支持多個簽名(多態性)。

因此,如果需要這種操作,最好切換到下面描述的最高級的類型推斷注釋。

當涉及到閉包參數類型推斷時,最初需要解決的問題是,Groovy類型系統繼承了Java類型系統,而Java類型系統不足以描述參數的類型,也就是說,靜態地確定閉包的參數類型,而無需顯式地聲明它們。

2.3.3 使用@ClosureParams 注解

Groovy提供了一個注解@ClosureParams,用于完成類型信息。該注釋主要針對那些希望通過提供類型推斷元數據來擴展類型檢查器功能的框架和API開發人員。如果我們的庫使用閉包,并且也希望獲得最大級別的工具支持,那么這一點非常重要。

讓我們通過修改原始示例來說明這一點,引入@ClosureParams注釋:

import groovy.transform.stc.ClosureParams
import groovy.transform.stc.FirstParam
void inviteIf(Person p, @ClosureParams(FirstParam) Closure<Boolean> predicate) { //閉包參數用@ClosureParams注釋
if (predicate.call(p)) {
// send invite
// ...
}
}
inviteIf(p) {
it.age >= 18 //沒有必要為它使用顯式類型,因為它是推斷出來的
}

@ClosureParams?注釋最少接受一個參數,該參數被命名為類型提示。類型提示是一個類,它負責在閉包的編譯時完成類型信息。在本例中,使用的類型提示是groovy.transform.stc.FirstParam?,它向類型檢查器指示閉包將接受一個類型為方法第一個參數類型的參數。在本例中,方法的第一個參數是Person?,因此它向類型檢查器指示閉包的第一個參數實際上是Person。

第二個可選參數名為options。它的語義取決于類型提示類。Groovy提供了各種捆綁的類型提示,如下表所示:

類型提示

多態

描述和示例

??FirstParam??? ??SecondParam??? ??ThirdParam??

No

第一個(回復。第二,第三)參數類型的方法: ??import groovy.transform.stc.FirstParam void doSomething(String str, @ClosureParams(FirstParam) Closure c) { c(str) } doSomething('foo') { println it.toUpperCase() }``import groovy.transform.stc.SecondParam void withHash(String str, int seed, @ClosureParams(SecondParam) Closure c) { c(31*str.hashCode()+seed) } withHash('foo', (int)System.currentTimeMillis()) { int mod = it%2 }``import groovy.transform.stc.ThirdParam String format(String prefix, String postfix, String o, @ClosureParams(ThirdParam) Closure c) { "$prefix${c(o)}$postfix" } assert format('foo', 'bar', 'baz') { it.toUpperCase() } == 'fooBAZbar'??

??FirstParam.FirstGenericType??? ??SecondParam.FirstGenericType??? ??ThirdParam.FirstGenericType??

No

第一個泛型類型(resp。第二,方法的第三)參數 ??import groovy.transform.stc.FirstParam public <T> void doSomething(List<T> strings, @ClosureParams(FirstParam.FirstGenericType) Closure c) { strings.each { c(it) } } doSomething(['foo','bar']) { println it.toUpperCase() } doSomething([1,2,3]) { println(2*it) }???Variants for ??SecondGenericType??? and ??ThirdGenericType??? exist for all ??FirstParam???, ??SecondParam??? and ??ThirdParam?? type hints.

??SimpleType??

No

閉包參數的類型來自選項字符串的類型提示。??import groovy.transform.stc.SimpleType public void doSomething(@ClosureParams(value=SimpleType,options=['java.lang.String','int']) Closure c) { c('foo',3) } doSomething { str, len -> assert str.length() == len }??此類型提示支持單個簽名,并且使用完全限定類型名或基本類型將每個參數指定為options數組的值。

??MapEntryOrKeyValue??

Yes

一個專用的閉包類型提示,可以在??Map.Entry???的單個參數,或者兩個參數分別對應鍵和值。??import groovy.transform.stc.MapEntryOrKeyValue public <K,V> void doSomething(Map<K,V> map, @ClosureParams(MapEntryOrKeyValue) Closure c) { // ... } doSomething([a: 'A']) { k,v -> assert k.toUpperCase() == v.toUpperCase() } doSomething([abc: 3]) { e -> assert e.key.length() == e.value }???這個類型提示要求第一個參數是??Map???類型,并從??Map??實際的鍵/值類型推斷閉包參數類型。

??FromAbstractTypeMethods??

Yes

從某種類型的抽象方法推斷閉包參數類型。為每個抽象方法推斷一個簽名。??import groovy.transform.stc.FromAbstractTypeMethods abstract class Foo { abstract void firstSignature(int x, int y) abstract void secondSignature(String str) } void doSomething(@ClosureParams(value=FromAbstractTypeMethods, options=["Foo"]) Closure cl) { // ... } doSomething { a, b -> a+b } doSomething { s -> s.toUpperCase() }???如果像上面的例子一樣有多個簽名,那么只有在每個方法的元數不同的情況下,類型檢查器才能推斷出參數的類型。在上面的例子中,??firstSignature???接受2個參數,??secondSignature??接受1個參數,因此類型檢查器可以根據參數的數量推斷參數類型。但是請參閱下面討論的可選解析器類屬性。

??FromString??

Yes

從options參數推斷閉包參數類型。options參數由逗號分隔的非基元類型數組組成。數組中的每個元素都對應一個簽名,元素中的每個逗號分別對應簽名的參數。簡而言之,這是最通用的類型提示,選項映射的每個字符串都像簽名文字一樣被解析。雖然這種類型提示非常強大,但如果可以的話必須避免,因為它會由于解析類型簽名的必要性而增加編譯時間。??接受String的閉包的單個簽名::??import groovy.transform.stc.FromString void doSomething(@ClosureParams(value=FromString, options=["String","String,Integer"]) Closure cl) { // ... } doSomething { s -> s.toUpperCase() } doSomething { s,i -> s.toUpperCase()*i }???一個多態閉包,接受??String???或??String???, ??Integer???:??import groovy.transform.stc.FromString void doSomething(@ClosureParams(value=FromString, options=["String","String,Integer"]) Closure cl) { // ... } doSomething { s -> s.toUpperCase() } doSomething { s,i -> s.toUpperCase()*i }???一個多態閉包,接受一個T或一對T,T:??import groovy.transform.stc.FromString public <T> void doSomething(T e, @ClosureParams(value=FromString, options=["T","T,T"]) Closure cl) { // ... } doSomething('foo') { s -> s.toUpperCase() } doSomething('foo') { s1,s2 -> assert s1.toUpperCase() == s2.toUpperCase() }??

即使你使用FirstParam?, SecondParam或ThirdParam作為類型提示,這并不嚴格意味著將傳遞給閉包的參數將是第一個(resp。方法調用的第二個,第三個)參數。這只意味著閉包的參數類型將與第一個(resp。方法調用的第二個,第三個)參數。

PS: 上面的表格,從Groovy中直接賦值的。所以表格閱讀比較難看

簡而言之,在接受Closure?的方法上缺少@ClosureParams注釋不會導致編譯失敗。如果存在(它可以出現在Java源代碼中,也可以出現在Groovy源代碼中),則類型檢查器具有更多信息,并可以執行額外的類型推斷。這使得框架開發人員對該特性特別感興趣。

第三個可選參數名為conflictResolutionStrategy。它可以引用一個類(從

ClosureSignatureConflictResolver擴展而來),如果在初始推斷計算完成后發現了多個參數類型,則該類可以執行額外的參數類型解析。Groovy提供了一個默認類型解析器,它什么都不做,另一個則在找到多個簽名時選擇第一個簽名。解析器僅在發現多個簽名時調用,并且被設計為后處理器。任何需要注入類型信息的語句都必須傳遞一個通過類型提示確定的參數簽名。解析器然后從返回的候選簽名中選擇。

類型檢查器使用@DelegatesTo?注釋推斷委托的類型。它允許API設計者指示編譯器委托的類型和委托策略。@DelegatesTo注釋將在其他內容中進行專門的討論。這里就不擴展了。

3. 靜態編譯

3.1 動態與靜態

在類型檢查部分,我們已經看到Groovy通過@TypeChecked?注釋提供了可選的類型檢查。類型檢查器在編譯時運行,并對動態代碼執行靜態分析。無論是否啟用類型檢查,程序的行為都完全相同。這意味著@TypeChecked注釋對于程序的語義是中立的。盡管可能有必要在源中添加類型信息以使程序被認為是類型安全的,但最終,程序的語義是相同的。

雖然這聽起來很好,但實際上有一個問題:在編譯時執行的動態代碼的類型檢查,根據定義,只有在沒有發生特定于運行時的行為時才正確。例如,下面的程序通過了類型檢查:

class Computer {
int compute(String str) {
str.length()
}
String compute(int x) {
String.valueOf(x)
}
}

@groovy.transform.TypeChecked
void test() {
def computer = new Computer()
computer.with {
assert compute(compute('foobar')) =='6'
}
}

有兩種計算方法。一個接受String?并返回int?,另一個接受int?并返回String?。如果你編譯這個,它被認為是類型安全的:內部compute('foobar')?調用將返回一個int?,并且在這個int?上調用compute?將返回一個String。

現在,在調用test()之前,考慮添加以下行:

Computer.metaClass.compute = { String str -> new Date() }

使用運行時編程,我們實際上是在修改compute(String)?方法的行為,這樣它就不會返回所提供的參數的長度,而是返回一個Date。如果執行該程序,它將在運行時失敗。因為這一行可以在任何線程的任何地方添加,所以類型檢查器絕對沒有辦法靜態地確保沒有這樣的事情發生。簡而言之,類型檢查器很容易受到猴子修補的攻擊。這只是一個例子,但它說明了對動態程序進行靜態分析本質上是錯誤的。

Groovy為@typecheck?提供了另一種注釋,它實際上將確保被推斷為被調用的方法將在運行時有效地被調用。該注釋將Groovy編譯器轉換為靜態編譯器,其中所有方法調用都在編譯時解析,生成的字節碼確保實現這一點:注釋是@groovy.transform.CompileStatic。

3.2 @CompileStatic 注解

@CompileStatic?注釋可以添加到@TypeChecked?注釋可以使用的任何地方,也就是說,在類或方法上。沒有必要同時添加@TypeChecked和@CompileStatic?,因為@CompileStatic?執行@TypeChecked所做的一切,但是還會觸發靜態編譯。

讓我們以失敗的例子為例,但這一次讓我們用@CompileStatic?替換@TypeChecked注釋:

class Computer {
int compute(String str) {
str.length()
}
String compute(int x) {
String.valueOf(x)
}
}

@groovy.transform.CompileStatic
void test() {
def computer = new Computer()
computer.with {
assert compute(compute('foobar')) =='6'
}
}
Computer.metaClass.compute = { String str -> new Date() }
test()

這是唯一的區別。如果我們執行這個程序,這次就不會出現運行時錯誤。test?方法不再受猴子補丁的影響,因為在它的主體中調用的計算方法在編譯時是鏈接的,所以即使Computer的元類發生了變化,程序仍然按照類型檢查器的預期行事。

3.3 關鍵優勢

在代碼中使用@CompileStatic有幾個好處:

  • 類型安全
  • 對猴子補丁(monkey patching)免疫
  • 性能改進

性能的提高取決于所執行程序的類型。

如果它受I/O限制,靜態編譯代碼和動態代碼之間的區別幾乎不明顯。

對于高度CPU密集型的代碼,由于生成的字節碼與Java為等效程序生成的字節碼非常接近(如果不是相等的話),因此性能得到了極大的提高。

4. 小結

到這里關于類型的相關知識就介紹完畢了,以上內容可以通過Groovy官方文檔:Groovy Language Documentation (groovy-lang.org)了解更多知識。

PS:類型知識的介紹更多的是從各種概念定義等方面詳細介紹各種類型推斷的過程。我們其實可以簡單了解。

責任編輯:武曉燕 來源: zinyan
相關推薦

2023-01-02 23:58:03

2022-12-28 08:03:02

Groovy語法GPath

2022-12-26 08:36:53

Groovy語法控制結構

2010-04-22 22:36:21

F5負載均衡器

2023-01-05 08:09:27

GroovyDSL?

2023-04-06 07:49:23

Python數據類型

2023-01-06 08:06:52

Groovy類型擴展

2022-12-29 08:16:45

Groovy語法coercion

2011-07-06 11:19:45

Objective-C

2011-08-24 13:23:35

Access 2010

2012-07-02 10:43:49

JVMGroovyJava

2012-07-12 11:23:07

GroovyJVM

2011-08-23 13:16:41

SQLEXPLAIN

2024-06-21 09:37:02

DefPython函數

2010-09-06 13:15:48

CSS定位

2013-04-17 10:20:27

GroovyClassLoader

2009-12-18 15:06:10

Ruby常用庫

2010-11-11 10:18:59

select into

2009-07-07 14:21:00

JSP語法

2010-09-17 14:49:04

Java數據類型
點贊
收藏

51CTO技術棧公眾號

a级黄色片免费看| xxx中文字幕| eeuss影院www在线播放| 久久99精品一区二区三区| 欧美精品做受xxx性少妇| 国产人妻精品午夜福利免费| 在线女人免费视频| 中文字幕一区二区在线观看| 国产福利久久精品| 黄色大全在线观看| 亚洲午夜久久久久久尤物| 亚洲码在线观看| 亚洲精品在线网址| 丝袜美腿诱惑一区二区三区| 亚洲免费观看高清完整版在线观看 | 91视频免费在线看| 综合色就爱涩涩涩综合婷婷| 4438x成人网最大色成网站| 国产一级爱c视频| 天天影视久久综合| 久久综合网色—综合色88| 成人免费福利在线| 最近免费中文字幕大全免费版视频| 99成人超碰| 亚洲视频在线视频| 国产69视频在线观看| aaaa欧美| 色综合天天综合网天天看片| 成人在线播放网址| а√天堂在线官网| 欧美激情综合网| 国语精品中文字幕| 性欧美一区二区三区| 日韩av网站免费在线| 国产91精品久久久| 国产真实乱人偷精品视频| 先锋资源久久| 永久免费毛片在线播放不卡| 国产精品300页| 国产香蕉精品| 亚洲精品一区二区三区精华液 | 久久精品国产v日韩v亚洲| 亚洲熟妇一区二区三区| 久久午夜影院| 亚洲韩国青草视频| 看全色黄大色黄女片18| 天堂va欧美ⅴa亚洲va一国产| 欧美日韩成人在线一区| 亚洲这里只有精品| 久久精品嫩草影院| 欧美日韩视频专区在线播放| 成人午夜激情av| 亚洲女色av| 色综合 综合色| 亚洲人成无码www久久久| 亚洲欧洲自拍| 欧洲视频一区二区| 人人干人人干人人| 日本国产亚洲| 9191成人精品久久| 被黑人猛躁10次高潮视频| 国产精品一区二区三区四区在线观看| 欧美精品丝袜中出| 在线a免费观看| 中文无码日韩欧| 日韩av网站在线| 黄色aaa视频| 精品欧美久久| 日韩视频一区在线| 殴美一级黄色片| 午夜精品免费| 97福利一区二区| 午夜精品一区二| 麻豆成人久久精品二区三区红| 国产在线精品成人一区二区三区| 国产又粗又猛又黄又爽| 国产精品一区二区在线观看网站| 99理论电影网| 蜜臀久久99精品久久久| 99久久精品国产毛片| 欧美日韩另类丝袜其他| 午夜视频在线观看网站| 亚洲激情自拍视频| 黄色网页免费在线观看| 777午夜精品电影免费看| 欧美一区二区三区啪啪| 国产美女视频免费观看下载软件| 国产一区二区精品福利地址| 欧美精品在线第一页| 三级视频在线观看| 麻豆免费精品视频| 国产精品久久久久久久久久久久冷 | 蜜臀久久99精品久久久久久9 | 欧美色图国产精品| 久热精品在线视频| xxxx.国产| 精品午夜一区二区三区在线观看| 国产精品久久久久久久久婷婷| 国产三级视频在线看| 亚洲欧美区自拍先锋| 九九九九免费视频| 国产精品日本一区二区三区在线 | 欧美写真视频网站| 香蕉久久久久久av成人| 激情综合网站| 欧美黑人巨大xxx极品| 欧美日韩 一区二区三区| 国产风韵犹存在线视精品| 欧美中日韩免费视频| 欧美xxxx黑人又粗又长| 欧美性做爰猛烈叫床潮| 亚洲av成人精品一区二区三区| 91亚洲自偷观看高清| 97在线看福利| 精品国产18久久久久久| 久久久不卡网国产精品一区| 亚洲精品久久久久久久蜜桃臀| 国产福利一区二区三区在线播放| 亚洲第一网站男人都懂| 乱h高h女3p含苞待放| 视频一区视频二区中文| 国内一区二区三区在线视频| 国产激情视频在线观看| 欧美性生活大片视频| 欧美bbbbb性bbbbb视频| 亚洲夜间福利| 91av一区二区三区| 思思99re6国产在线播放| 岛国视频午夜一区免费在线观看| 久草福利在线观看| 国产精品国内免费一区二区三区| 日韩美女在线看| 天天干天天干天天干| 一区二区成人在线| 免费不卡av网站| 精品一区二区三| 国产91精品高潮白浆喷水| 亚洲免费成人在线| 一区二区三区小说| 超碰在线免费av| 亚洲国产精品成人| 91精品国产综合久久香蕉的用户体验 | 欧美一区免费看| 久久只精品国产| 黄在线观看网站| 天天躁日日躁狠狠躁欧美巨大小说| 欧美精品videosex性欧美| 国产福利小视频| 亚洲视频每日更新| xxx中文字幕| 女人香蕉久久**毛片精品| 91在线观看免费高清完整版在线观看| 麻豆91在线| 欧美一区二区精美| 深夜福利影院在线观看| 国产成人免费在线| 18黄暴禁片在线观看| 国产一区二区三区亚洲| 4438全国成人免费| 国产精品久久久久一区二区国产 | 中国特级黄色片| 1024日韩| 欧美另类网站| 91成人抖音| 久久久999成人| 亚洲欧美激情国产综合久久久| 一二三四社区欧美黄| 老熟妇精品一区二区三区| 在线亚洲自拍| 少妇特黄a一区二区三区| 日韩黄色三级| 精品中文字幕乱| 五月婷婷久久久| 一本色道亚洲精品aⅴ| 美国美女黄色片| 国产一区二区福利视频| 福利视频一区二区三区四区| 欧美丝袜足交| 国产精品亚洲片夜色在线| fc2ppv国产精品久久| 亚洲成人久久久久| 少妇又紧又色又爽又刺激视频| 中文字幕一区日韩精品欧美| 日本性生活一级片| 免费成人性网站| 国产一区 在线播放| 日韩激情网站| 91精品中文在线| 成人影音在线| 综合网日日天干夜夜久久| 国产成人精品毛片| 欧美性猛交xxxx免费看久久久| 欧美性生给视频| 成人国产精品免费| 污视频网址在线观看| 亚洲第一在线| 中文字幕av日韩精品| 国产精品调教| 91免费人成网站在线观看18| 亚洲最大成人| 欧美成年人网站| 国产三区四区在线观看| 欧美成人性福生活免费看| 999视频在线| 亚洲国产精品麻豆| 999精品在线视频| 91在线观看地址| 欧美xxxx黑人| 美女视频黄a大片欧美| 国产免费黄色小视频| 五月天久久777| 欧美连裤袜在线视频| 凹凸成人在线| 91色p视频在线| 成人在线免费av| 欧美一级片在线播放| 性欧美ⅴideo另类hd| 色狠狠久久aa北条麻妃| 日本福利在线观看| 精品国产乱码久久久久久夜甘婷婷 | 888av在线视频| 日韩在线视频免费观看| 邻居大乳一区二区三区| 亚洲精品ady| 亚洲精品国产精品乱码不卡| 欧美日韩国产大片| 一级一级黄色片| 在线看不卡av| 亚洲大片免费观看| 黑人欧美xxxx| 影音先锋亚洲天堂| 亚洲一区二区三区视频在线| 91视频青青草| ...xxx性欧美| 视频国产一区二区| 国产精品久久久久久久浪潮网站| 熟女高潮一区二区三区| 久久久久久久久岛国免费| 污片免费在线观看| a级高清视频欧美日韩| 精品人妻一区二区免费| 豆国产96在线|亚洲| 亚洲综合中文网| 成人免费视频一区二区| 国产精品偷伦视频免费观看了| 国产大陆精品国产| 亚洲精品一区二区18漫画| 国产精品资源在线观看| 日本精品一区在线| 国产麻豆精品久久一二三| 国产成人av片| 99久久精品国产一区二区三区| 中文字幕在线播放视频| 91麻豆免费看| 国产肥白大熟妇bbbb视频| 国产日本欧洲亚洲| 99久久99久久精品免费| 国产精品久久影院| 91久久国产综合| 亚洲国产成人av好男人在线观看| 豆国产97在线 | 亚洲| 舔着乳尖日韩一区| 五月天激情四射| 欧美日韩免费观看一区二区三区| 91美女精品网站| 欧美不卡一区二区| 午夜视频福利在线| 在线a欧美视频| 免费网站成人| 久久成人国产精品| heyzo高清中文字幕在线| 欧洲亚洲免费视频| 日韩一区二区三区四区五区 | 亚洲图色中文字幕| 国产一区在线观看视频| 美女久久久久久久久| 久久综合视频网| 91制片厂在线| 五月开心婷婷久久| 中文字幕 亚洲视频| 日韩一区二区视频| 三区在线视频| 日韩在线观看免费高清| 国产极品人妖在线观看| 国产大片精品免费永久看nba| 亚洲综合伊人| 久久精品美女| 国产精品7m凸凹视频分类| 搞av.com| 久久99国产精品麻豆| 亚洲一级Av无码毛片久久精品| 国产婷婷精品av在线| 黄色一级视频在线观看| 色菇凉天天综合网| 精品免费久久久| 一本一本久久a久久精品牛牛影视| 中文字幕在线观看播放| 国产成人精品久久二区二区| 国产精品亚洲欧美日韩一区在线| 久久久久久艹| 欧美精品一卡| 污污的网站18| 91丨porny丨户外露出| 91精品国产闺蜜国产在线闺蜜| 天天色图综合网| 国产亲伦免费视频播放| 亚洲天堂男人天堂女人天堂| a级片免费在线观看| 91精品国产综合久久香蕉922 | 亚洲三级av在线| 搞黄网站在线看| 91精品久久久久久久久久入口| 综合亚洲自拍| 成人免费视频91| 国产在线国偷精品产拍免费yy| 日韩网站在线播放| 亚洲v中文字幕| h狠狠躁死你h高h| 久久精品国产2020观看福利| 二吊插入一穴一区二区| 狠狠色狠狠色综合人人| 欧美日韩亚洲一区三区| 手机在线国产视频| 亚洲国产精品成人综合| 一二三区免费视频| 国产午夜精品麻豆| free性欧美| 国产伦精品一区二区三区高清| 图片区亚洲欧美小说区| 天天干天天av| 中文一区二区在线观看 | 日韩欧美的一区| 免费观看在线午夜影视| 国产精品亚洲精品| 日韩国产欧美| 在线观看亚洲色图| 欧美国产精品专区| 久久精品偷拍视频| 亚洲人成电影在线| 欧美一级大黄| 欧美日韩一区在线观看视频| 久久大逼视频| 中日韩精品一区二区三区| 精品国产老师黑色丝袜高跟鞋| 日韩专区第一页| 久久乐国产精品| 久久视频在线观看| 熟女性饥渴一区二区三区| 99国产精品国产精品久久| 国产69精品久久久久久久久久| 亚洲黄色av网站| 蜜臀国产一区| 四虎影院一区二区三区| 日本大胆欧美人术艺术动态| 调教驯服丰满美艳麻麻在线视频| 欧美体内she精视频| 日本成人在线播放| 91久久精品美女| 午夜日本精品| 国产精品300页| 色综合久久88色综合天天| 大胆av不用播放器在线播放| 国产精品一区二区三区久久久| 99久久婷婷国产综合精品电影√| 国产毛片久久久久久| 亚洲成人7777| 国内三级在线观看| 国产色视频一区| 午夜精品久久99蜜桃的功能介绍| 男女一区二区三区| 一本久久a久久精品亚洲| 91亚洲欧美| 成人91视频| 久久高清一区| 99热6这里只有精品| 日韩视频一区在线观看| 6699嫩草久久久精品影院| 奇米精品在线| 国产精品综合二区| 久久久久久久久影院| 在线看日韩欧美| 亚洲天堂av资源在线观看| 97超碰青青草| 中文字幕一区二区三区av| 欧洲av在线播放| 国产美女精品视频| 亚洲欧洲午夜| 国产精品久久国产精麻豆96堂| 精品久久久三级丝袜| 偷拍精品精品一区二区三区| 欧美日韩视频免费在线观看| thepron国产精品| 在线观看免费高清视频| 国语自产精品视频在免费| 欧美色图国产精品| 麻豆tv在线观看| 欧美日本韩国一区二区三区视频| 激情网站在线| 一区二区视频在线播放| 成人h版在线观看|