精品欧美一区二区三区在线观看 _久久久久国色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ⅴ在线观看| 日韩欧美不卡在线观看视频| 欧美 丝袜 自拍 制服 另类 | 亚洲天天在线日亚洲洲精| 亚洲va综合va国产va中文| 国内在线视频| 日本一区二区久久| 岛国一区二区三区高清视频| 波多野结衣一区二区三区四区| 婷婷六月综合| 亚洲人成网在线播放| 在线观看免费视频国产| 本网站久久精品| 婷婷开心激情综合| 国产911在线观看| 国产裸舞福利在线视频合集| 成人精品鲁一区一区二区| 国产精品视频最多的网站| 特一级黄色大片| 欧美成人精品| 日韩天堂在线视频| 90岁老太婆乱淫| 精品素人av| 日韩精品一区二区三区蜜臀| 伊人影院综合在线| 欧美精品总汇| 日韩欧美大尺度| 人妻久久久一区二区三区| 国产在线高清视频| 国产精品福利在线播放| 日韩影片在线播放| 裸体xxxx视频在线| 久久先锋资源网| 久久大香伊蕉在人线观看热2| 亚洲AV无码乱码国产精品牛牛| 久久99精品久久久久久动态图| 国产成人精品电影久久久| 国产无套丰满白嫩对白| 亚洲精品字幕| 亚州欧美日韩中文视频| 免费一级黄色大片| 欧美日韩岛国| 欧美另类高清videos| 99久久婷婷国产综合| 91综合久久| 在线观看免费高清视频97| 蜜桃av乱码一区二区三区| 国产亚洲一区二区三区不卡| 亚洲精品一区中文| 中文字幕成人动漫| 亚洲最好看的视频| 一二美女精品欧洲| 欧美极品jizzhd欧美18| 国产精品成人一区二区不卡| 日韩一区视频在线| 午夜写真片福利电影网| 精品99视频| 91成人在线视频| 成人毛片在线播放| 麻豆视频观看网址久久| 成人黄色免费看| 99国产在线播放| 国产不卡视频一区| 狼狼综合久久久久综合网| 日本一卡二卡四卡精品| 中文字幕av不卡| 久久av秘一区二区三区| 污视频网站在线免费| 亚洲成人av一区| 人妻少妇被粗大爽9797pw| 精品裸体bbb| 欧美一区二区三区视频在线 | 一区二区三区亚洲视频| 国产一区二区三区精品视频| 成人av免费电影| 日本1级在线| 中文字幕在线不卡一区二区三区| 制服诱惑一区| 高端美女服务在线视频播放| 91久久精品一区二区三区| www.污污视频| 国产精品qvod| 中文亚洲视频在线| 久久艹精品视频| 久久精品一本| 97中文在线| 国产一级网站视频在线| 伊人夜夜躁av伊人久久| 日本一区二区黄色| 国产一区二区三区亚洲综合| 亚洲激情久久久| 国产一区第一页| 999在线观看精品免费不卡网站| 国产v综合v亚洲欧美久久| 国产成年妇视频| 久久久影院官网| 麻豆md0077饥渴少妇| 中文字幕乱码中文乱码51精品| 欧美探花视频资源| 完美搭档在线观看| 婷婷综合五月| 国产不卡一区二区在线播放| 午夜精品一二三区| 国产精品沙发午睡系列990531| 毛片av在线播放| 国产第一精品| 亚洲欧洲av一区二区| 麻豆一区产品精品蜜桃的特点 | 国产精品久久久久久久久免费看| 精品久久国产视频| 中文字幕免费不卡在线| 日韩欧美一区二| 亚洲日本va中文字幕| 中文字幕在线成人| 欧美性猛交bbbbb精品| 丁香啪啪综合成人亚洲小说| 一区二区不卡在线| 亚洲精品粉嫩美女一区| 日韩高清人体午夜| 久久久精品人妻一区二区三区四| 蜜桃久久久久久| 日本免费高清一区二区| 美女网站在线看| 日韩精品一区二区三区视频播放| 午夜精品一区二区三级视频| 青草国产精品久久久久久| 看高清中日韩色视频| a级片在线免费观看| 日韩精品最新网址| 日本黄色小说视频| 国产一区二区剧情av在线| 亚洲日本精品国产第一区| 欧洲成人一区| 亚洲性猛交xxxxwww| 成人公开免费视频| 久久众筹精品私拍模特| 日本成年人网址| 群体交乱之放荡娇妻一区二区| 欧美激情二区三区| 国产黄频在线观看| 亚洲一区二区精品久久av| 四川一级毛毛片| 欧美福利影院| 成人欧美一区二区| 美足av综合网| 亚洲第一福利网| 国产 日韩 欧美 在线| 99久久精品免费观看| 欧美日韩黄色一级片| 日本欧美高清| 国产成人精品午夜| 91在线导航| 欧美一区日韩一区| 激情综合五月网| av电影天堂一区二区在线观看| 国产特级黄色大片| 国产精品亚洲二区| 国产美女扒开尿口久久久| xvideos国产在线视频| 欧美变态口味重另类| 国产精品第9页| 国产日韩欧美精品电影三级在线| 中国黄色片免费看| 91精品久久久久久久蜜月| 99国产在线观看| 蜜桃av.网站在线观看| 国产亚洲精品久久久久动| 一级特黄aaa| 亚洲最大的成人av| 成人乱码一区二区三区av| 日韩高清不卡一区二区三区| 中国成人在线视频| 国产精品白丝av嫩草影院| 国产精品成av人在线视午夜片| 五月天婷婷在线视频| 日韩视频一区二区三区在线播放| 日韩少妇裸体做爰视频| 久久久久9999亚洲精品| 久久久久久久久久毛片| 亚洲综合精品四区| 久久99国产精品一区| 三级小说欧洲区亚洲区| 成人综合网网址| 国产传媒av在线| 精品国产一区二区在线| 男人天堂网在线视频| 欧美视频一区二区在线观看| 欧美黄色一级网站| 国产女主播一区| 成人做爰69片免费| 蜜桃精品视频在线| 男人添女人下部高潮视频在观看| 日韩电影免费网站| 精品国产乱码久久久久软件 | 精品第一国产综合精品aⅴ| 国产黄色免费观看| 亚洲一级片在线观看| 天天干天天操天天拍| 99久久精品免费看| 污污视频在线免费| 久久只有精品| 久久久久久免费看| 久久精品亚洲人成影院| 欧美一区二区三区四区夜夜大片| 欧美精品影院| 国产精品极品美女在线观看免费 | 国产露出视频在线观看| 精品嫩草影院久久| 91国产免费视频| 91久久精品日日躁夜夜躁欧美| 伊人365影院| 亚洲男人都懂的| 色撸撸在线视频| 久久久青草青青国产亚洲免观| 中文字幕乱视频| 国产成人一区在线| 999热精品视频| 久久国产精品露脸对白| 欧美精品aaaa| 久久久精品五月天| 大陆极品少妇内射aaaaa| 中文字幕一区二区三区久久网站| 婷婷精品国产一区二区三区日韩| 欧美18xxxx| 国产麻豆乱码精品一区二区三区 | 日韩精品一区二区在线观看| 亚洲天堂国产精品| 欧美午夜影院一区| 91视频久久久| 91福利资源站| 日本熟妇一区二区三区| 欧美日韩在线另类| 国产尤物在线视频| 精品国产福利在线| 日韩av电影网| 午夜一区二区三区视频| 国产对白videos麻豆高潮| 亚洲一区二区三区精品在线| 久久久久免费看| 亚洲一卡二卡三卡四卡无卡久久| 男女羞羞免费视频| 亚洲国产综合在线| 日本一区二区网站| 精品久久久久久亚洲国产300| 91久久国产视频| 欧美日韩亚洲激情| 无码人妻丰满熟妇区五十路| 色吊一区二区三区| 成人午夜精品视频| 欧美欧美欧美欧美| 国产夫绿帽单男3p精品视频| 日韩一区二区电影| 亚洲欧美强伦一区二区| 日韩精品视频中文在线观看| 麻豆app在线观看| 日韩在线小视频| 在线中文字幕视频观看| 久久久久中文字幕| 少妇视频一区| 国产精品久久网| 国产午夜久久av| 国产乱码精品一区二区三区日韩精品 | 美国毛片一区二区| 一级黄色免费毛片| 成人免费毛片app| 色噜噜日韩精品欧美一区二区| 国产丝袜欧美中文另类| 青青青手机在线视频| 亚洲精品福利视频网站| 天海翼一区二区| 在线免费亚洲电影| 国产99久久九九精品无码免费| 亚洲国产日韩欧美在线动漫| 国产美女性感在线观看懂色av| 久久在线观看视频| 日韩欧美一中文字暮专区| 成人xvideos免费视频| 99国产精品久久一区二区三区| 欧美日韩一区在线观看视频| 久久久久久久久99精品大| 2018国产在线| 男女男精品视频| 国模私拍在线观看| 国产精品视频免费| 午夜影院在线看| 欧美日本国产一区| 午夜国产在线视频| www.久久久久| 中文字幕成在线观看| 3d动漫啪啪精品一区二区免费| 亚洲第一二三区| 久久人妻无码一区二区| 久久综合狠狠| xfplay5566色资源网站| 国产精品免费久久| 少妇一级淫片免费放中国| 欧美福利一区二区| 男人天堂网在线观看| 欧美日韩成人精品| 韩国精品视频在线观看| 狼狼综合久久久久综合网| 中文字幕一区二区精品区| 欧美三级理论片| 91丝袜高跟美女视频| 激情四射综合网| 欧美精品123区| 欧美美女搞黄| 97精品国产97久久久久久春色| 欧美系列精品| 日本高清视频一区二区三区| 在线欧美福利| 免费黄视频在线观看| 国产精品久久夜| 成人a v视频| 精品一区电影国产| 白白色在线观看| 亚洲一区中文字幕在线观看| 成人高清电影网站| 午夜视频在线瓜伦| 91麻豆精品秘密| 人人干人人干人人干| 精品国产一区二区在线观看| 黄av在线播放| 成人做爽爽免费视频| 99精品网站| 中国黄色片一级| 中文字幕一区二区三区不卡在线| 日韩免费av网站| 亚洲欧美国产精品专区久久 | 日本高清免费不卡视频| 亚洲欧美日韩成人在线| 97精品视频在线观看| 成人偷拍自拍| 9久久9毛片又大又硬又粗| 成人综合婷婷国产精品久久| 欧美日韩免费做爰视频| 日韩欧美aaaaaa| 电影k8一区二区三区久久| 国产精品麻豆免费版| 欧美日韩第一区| 人妖粗暴刺激videos呻吟| 亚洲成人av中文| 亚洲av电影一区| 91成人免费观看网站| 奇米色欧美一区二区三区| 妓院一钑片免看黄大片| 中文字幕av一区 二区| 国产一区二区三区四区视频| zzijzzij亚洲日本成熟少妇| 国产精品日本一区二区不卡视频| 国产美女视频免费| 成人性生交大片免费看中文| 日韩欧美亚洲一区二区三区| 日韩激情视频在线播放| 国产精品一区二区av影院萌芽| 日本一区二区三区免费看| 免费在线观看精品| 国产大片免费看| 精品成人一区二区三区| 亚洲国产欧美日本视频| 天堂资源在线亚洲视频| 韩国成人福利片在线播放| a级片在线观看免费| 日韩成人网免费视频| 国产一区一一区高清不卡| 人人妻人人澡人人爽精品欧美一区| 国产精品亚洲专一区二区三区| 国产精品成人久久| 亚洲一区二区福利| 蜜桃精品视频| 人妻熟妇乱又伦精品视频| 欧美极品美女视频| 99久久国产免费| 欧美亚洲第一页| 日韩av有码| 亚洲精品乱码久久久久久蜜桃欧美| 欧美日韩亚洲成人| 日本不卡视频| 国产美女在线精品免费观看| 日韩av电影天堂| 欧美日韩在线观看免费| 亚洲欧洲xxxx| 伊人久久噜噜噜躁狠狠躁| 国产97色在线 | 日韩| 亚洲男同性视频| 国产黄色在线| 国产精品对白一区二区三区| 日韩av网站在线观看| 日韩毛片在线播放| 日韩一区二区在线视频| 全国精品免费看| 天堂网成人在线| 欧洲色大大久久| missav|免费高清av在线看| 一区二区视频在线播放| 99精品国产99久久久久久白柏| 91theporn国产在线观看|