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

Java底層知識:什么是 “橋接方法” ?

開發 前端
筆者羅列了幾種編譯器為我們自動生成橋接方法的情況。那么是否還有其他場景下,編譯器也會生成橋接方法呢?

筆者在最近的日常工作中,因業務需要,研究 Java 字節碼層面的知識。具體是,需要根據類字節碼,獲取特定方法名的方法入參,此方法名在源碼中只有一個。但是在實際使用中發現:在類實現泛型接口的情況下,在字節碼層面,類卻有兩個同名方法,導致無法確定哪個方法才是我們需要的方法。經過研究發現,其中一個方法是編譯器在編譯的過程中,自動生成的橋接方法(bridge method),兩個方法可通過特定標識區分。

注:此處的橋接方法,跟設計模式中的橋接模式,不是一個概念。

問題描述

為了能夠說明問題,筆者模糊了實際業務場景的具體案例,用一個稍微簡單,能夠說明問題的示例,來分析編譯器自動生成的橋接方法(bridge method)。

我們知道,Java 泛型是JDK 5 中引入的一個新特性,應用廣泛。比如,我們有一個操作算子泛型接口 Operator<T>,接口中有一個 process(T t) 方法,其作用是對入參 T 進行邏輯處理。示例代碼如下:

/**
* @author renzhiqiang
* @date 2022/2/20 18:30
*/
public interface Operator<T> {
/**
* process method
* @param t
*/
void process(T t);
}

在實際業務場景中,我們會有不同的操作算子,實現Operator 接口,進行業務邏輯處理。那么我們來創建一個具體的算子,并實現Operator 接口,重寫 process(T t) 方法。如下:

/**
* 用戶信息算子
* @author renzhiqiang
* @date 2022/2/20 18:30
*/
public class UserInfoOperator implements Operator<String> {
@Override
public void process(String s) {
// do something
}
}

其中,泛型接口中的入參類型 T,在實現類中替換成了實際需要的類型 java.lang.String。到這里,我們就準備好了代碼樣例。

那么,我們的目標是什么呢?就是要獲取UserInfoOperator#process(String s) 方法的參數類型java.lang.String。讀到這里,讀者可能會想:這不很簡單么,通過反射,根據Class#getDeclaredMethods(),獲取到 UserInfoOperator 的所有方法,再找到方法名是 process 的方法,然后再獲取到參數列表,不就可以獲取參數類型java.lang.String 了么。

如果正在閱讀文章的你也這么想的話,那請繼續往下看。

根據 Java 反射方法Class#getDeclaredMethods() 的描述:

Returns an array of Method objectsincluding public, protected, default (package) access, and private methods, butexcludes inherited methods.

翻譯過來就是:返回方法對象數組,包括公共方法、受保護方法、默認(包)訪問方法和私有方法,但不包括繼承方法。

根據我們的示例,如果我們通過反射,利用Class#getDeclaredMethods() 方法,我們預期的返回方法數組中,應該只有一個方法名是process 才對,但是這里卻有兩個 process 方法。驚不驚奇,意不意外!

圖 debug 發現 UserInfoOperator 類的兩個 process 方法

產生原因

編譯器生成 bridge 方法

我們知道,Java 源碼需要經過編譯器編譯,生成對應的 .class 文件,才能給 JVM 使用。在源碼中,我們只定義了一個名為 process 的方法。那么我們考慮,編譯器在編譯源碼的過程中,是否會進行一些特的處理。為了更加直觀的查看編譯后的字節碼文件,在 Idea 安裝 jclasslib 插件,通過 jclasslib 查看 UserInfoOperator 和 Operator 的字節碼。如下:

圖 jclasslib 查看 UserInfoOperator 類的字節碼(第一個 process 方法)

圖 jclasslib 查看 UserInfoOperator 類的字節碼 (第二個 process 方法)

圖 jclasslib 查看 Operator 類的字節碼

通過 jclasslib 查看 .class 文件發現,在 UserInfoOperator 類中確實存在兩個 process 方法:其中一個方法入參是 java.lang.String,另一個方法的入參是 java.lang.Object。而在 Operator 字節碼中,只有一個 process 方法,方法的入參是 java.lang.Object。同時我們注意到,在 UserInfoOperator 類的字節碼中, [訪問標志]項,其中一個方法的訪問標志是 [public synthetic bridge]。其中 public 很好理解,但是其中的 [synthetic bridge] 是怎么來的呢?

查閱相關資料后發現,標識符 synthetic ,表示此方法是否是由編譯器自動產生的;標識符 bridge,表示此方法是否是由編譯器產生的橋接方法。

圖 方法訪問標志(來源:深入理解 Java 虛擬機(第三版))

到此,可以確定的是,其中一個process 方法,是編譯器自動產生的橋接方法。那么為什么編譯器會產生橋接方法呢?以及在什么情況下,會產生橋接方法?以及如何判斷一個方法是不是橋接方法?我們繼續往下分析。

為何生成 bridge 方法

正確編譯

在源碼中,Operator 類的 process 方法的參數定義是 process(T t),參數類型是 T。而在字節碼層面我們看到,process 方法在編譯之后,編譯器將入參類型變成了 java.lang.Object。偽代碼示意,大概是這樣:

public interface Operator<Object> {
/**
* 方法參數變成 Object 類型
* @param object
*/
void process(Object object);
}

想象一下,如果沒有編譯器自動生成的橋接方法,那么在編譯層面是不能通過的:因為接口 Operator 中的 process 方法,,經過編譯之后,參數類型變成了 java.lang.Object 類型,而實現類 UserInfoOperator 中的 process 方法的參數是 java.lang.String 類型,兩者的方法參數不一致,導致UserInfoOperator 并沒有重寫接口中的 process 方法,因此編譯無法通過。

這種情況下,編譯器自動生成一個橋接方法 void process(Object obj) 方法,則可以編譯通過,似乎是理所當然的事情。自動生成的 process方法,方法簽名為:void process(Object object)。偽代碼示意,大概是這樣:

// 自動生成的process 方法
public void process(Object object) {
process((String) object);
}

類型擦除

我們知道,Java 中的泛型在編譯期間會將泛型信息擦除。如代碼定義 List 和 List,編譯之后都會變成 List。我們再考慮一種常見的情形:Java 類庫中比較器的用法。我們自定義比較器的時候,可以通過實現 Comparator 接口,實現比較邏輯。示例代碼如下:

public class MyComparator implements Comparator<Integer> {
public int compare(Integer a,Integer b) {
// 比較邏輯
}
}

這種情況下,編譯器同樣會產生一個橋接方法。方法簽名為 intcompare(Object a, Object b) 。

圖 MyComparator 類的兩個 compare 方法

偽代碼示意,大概是這樣:

public class MyComparator implements Comparator<Integer> {
public int compare(Integer a,Integer b) {
// 比較邏輯
}
// 橋接方法 (bridge method)
public int compare(Object a,Object b) {
return compare((Integer)a,(Integer)b);
}
}

因此,當我們使用如下方式進行比較的時候,能夠通過編譯并得到我們預期的結果:

Object a = 5;
Object b = 6;
Comparator rawComp = new MyComparator();
// 可以通過編譯,因為自動生成了橋接方法compare(Object a, Object b)
int comp = rawComp.compare(a, b);

另外,我們知道,泛型編譯之后,類型信息會被擦除。如果我們有這樣一個比較方法:

// 比較方法
public <T> T max(List<T> list, Comparator<T> comparator){
T biggestSoFar = list.get(0);
for ( T t : list ) {
if (comparator.compare(t,biggestSoFar) > 0) {
biggestSoFar = t;
}
}
return biggestSoFar;
}

編譯之后,泛型被擦除掉,偽代碼表示,大概是這樣:

public Object max(List list, Comparator comparator) {
Object biggestSoFar =list.get(0);
for ( Object t : list ) {
if (comparator.compare(t,biggestSoFar) > 0) { //比較邏輯
biggestSoFar = t;
}
}
return biggestSoFar;
}

我們將 MyComparator 其中一個參數傳入 max() 方法。如果沒有橋接方法的話,那么第四行的比較邏輯,將無法正確編譯,因為MyComparator 類中沒有兩個參數是 Object 類型的比較方法,只有參數類型是 Integer 類型的比較方法。讀者可自行測試。

解決方案

通過以上的案例描述,我們知道,在實現泛型接口的場景下,編譯器會自動生成橋接方法,保證編譯能夠通過。那么在這種情況下,我們只要識別哪一個是橋接方法,哪一個不是橋接方法,就可以解決我們一開始的問題。很自然的,既然編譯器自動產生了一個橋接方法,那么應該會有某種方式,可以讓我們判斷一個方法是否是橋接方法。

果然,我們繼續研究發現,Method 類中提供了 Method#isBridge() 方法。查看源碼中對方法的描述:Method#isBridge():Returns true if this method is a bridge method;returns false otherwise。

到此,我們通過反射,獲取到 UserInfoOperator 類中的兩個process 方法,再調用 Method#isBridge() 方法,即可鎖定需要的方法,因而進一步獲取方法參數 java.lang.String。

深入分析

至此可以說,就業務需求來說,我們完美的找到了解決方案。但在此之后,不禁會想:除了上述示例,還有哪些情況下,編譯器也會自動生成橋接方法呢?我們繼續深入研究。

類繼承

通過查閱相關資料,我們考慮如下一種情況:

/**
* 如下會產生橋接方法嗎?
* @author renzhiqiang
* @date 2022/2/20 18:33
*/
public class BridgeMethodSample {
static class A {
public void foo() {
}
}
public static class C extends A{
}
public static class D extends A{
@Override
public void foo() {
}
}
}

上述代碼示例中,我們定義了三個靜態內部類:A C D,其中 C D 分別繼承 A。經過編譯,通過jclasslib 查看 BridgeMethodSample 字節碼,我們也發現:類 C 中編譯器為其生成了橋接方法 void foo(),而類 D 中卻沒有。

圖 類C 生成橋接方法

圖 類D 沒有生成橋接方法

深入分析,并根據上述分析的經驗,我們猜測,編譯器生成橋接方法,一定是在某種情況下需要一個方法,來滿足 Java 編程規范,或者需要保證程序運行的正確性。通過字節碼可以看出,類 A 沒有 public 修飾,包范圍以外的程序是沒有訪問類 A 的權限的,更不用說類 A 中的方法。

但是類 C 是有public 修飾,C 類中的方法,包括繼承來的方法,是可以被包外的程序訪問的。因此,編譯器需要生成一個橋接方法,以保證能夠訪問 foo() 方法,滿足程序的正確運行。但是,類 D 同樣繼承 A,卻沒有生成橋接方法,根本原因是類 D 中重寫了父類 A 中的 foo() 方法,即沒有必要生成橋接方法。

方法重寫

我們再看一種情況,方法重寫。

Java 中,方法重寫(Override),是子類對父類的允許訪問的方法的實現過程進行重新編寫的過程。重寫需要滿足一定的規則:

1. The method must have the same name as in the parentclass.

2. The method must have the same parameter as in theparent class.

3. There must be an IS-A relationship (inheritance).

JDK 5 之后,重寫方法的返回類型,可以與父類方法返回類型相同,也可以不相同,但必須是父類方法返回類型的子類。我們考慮如下代碼示例:

// 定義一個父類,包含一個 test() 方法
public class Father {
public Object test(String s) {
return s;
}
}
// 定義一個子類,繼承父類
public class Child extends Father {
@Override
public String test(String s) {
return s;
}
}

以上,在 Child 子類中,我們重寫了 test() 方法,但是返回值的類型,我們將 java.lang.Object 改變為它的子類 java.lang.String。編譯之后,我們同樣使用 jclasslib 插件,查看兩個類的字節碼,如下所示:

圖 Child 類字節碼test() 方法(1)

圖 Child 類字節碼test() 方法(2)

圖 Father類字節碼test() 方法

根據上圖我們發現,Child 類中我們重寫了 test() 方法,但是在字節碼層面,發現有兩個 test() 方法,其中一個方法的訪問標志為 [public synthetic bridge], 表示這個方法是編譯器為我們生成的。而當我們不改變 Child#test() 方法的返回類型時,編譯器并沒有為我們生成橋接方法,讀者可自行試驗。

也就是說,在子類方法重寫父類方法,返回類型不一致的情況下,編譯器也為我們生成了橋接方法。

以上,筆者羅列了幾種編譯器為我們自動生成橋接方法的情況。那么是否還有其他場景下,編譯器也會生成橋接方法呢?如果您也曾研究過或者使用過 bridge 方法,歡迎交流討論。

同時,給出一個 bridge 方法的非官方定義,希望能夠給讀者一些啟發:

Bridge Method: These are methods that create an intermediate layerbetween the source and the target functions. It is usually used as part of thetype erasure process. It means that the bridge method is required as a typesafe interface.

限于筆者水平有限,難免有理解不準確、不到位的地方。歡迎交流討論!

參考

https://stackoverflow.com/questions/5007357/java-generics-bridge-method

https://stackoverflow.com/questions/14144888/find-generic-method-with-actual-types-from-getdeclaredmethods

https://www.geeksforgeeks.org/method-class-isbridge-method-in-java/


責任編輯:武曉燕 來源: 程序員小灰
相關推薦

2021-10-22 09:41:26

橋接模式設計

2010-03-19 11:31:15

點對多點無線橋接

2009-12-04 17:39:56

無線路由器中繼功能

2020-10-28 11:56:47

橋接模式

2010-04-09 16:15:02

無線橋接設置

2022-01-14 09:22:22

設計模式橋接

2023-03-30 11:26:37

5GWi-Fi

2009-08-18 11:12:34

Ubuntu下Virt橋接網絡配置

2021-03-05 07:57:41

設計模式橋接

2009-05-13 09:39:00

雙網卡共享帶寬

2022-05-11 08:17:15

Java字符串API

2011-06-01 16:10:42

JNBridge

2010-03-19 11:07:57

點對點無線橋接模式

2010-04-08 17:02:14

無線橋接方案

2019-07-30 08:28:44

VirtualBox橋接網絡

2011-11-10 16:43:59

WDS無線橋接

2010-03-19 11:46:35

點對多點無線橋接

2009-05-14 15:36:00

DHCP地址故障

2016-01-28 13:28:43

VoLTE科普4G

2009-12-01 10:24:45

路由器IP設置
點贊
收藏

51CTO技術棧公眾號

国产精品一区二区黑人巨大 | 黄色在线观看视频网站| 国产超碰在线一区| 2021国产精品视频| 亚洲怡红院在线观看| 风间由美一区二区av101| 在线欧美一区二区| 亚洲爆乳无码精品aaa片蜜桃| 日韩a级作爱片一二三区免费观看| 美女精品一区二区| 国产91ⅴ在线精品免费观看| 男人在线观看视频| 国产精品最新| 亚洲白虎美女被爆操| 五月婷婷丁香色| 老牛影视精品| 亚洲欧美日韩综合aⅴ视频| 麻豆av一区二区| 精品人妻无码一区二区| 蜜臀av国产精品久久久久| 欧美激情免费在线| 精品无码一区二区三区蜜臀| 视频国产一区| 亚洲国产天堂久久综合| 91大神免费观看| av成人亚洲| 欧美日韩国产限制| 97碰在线视频| www在线观看播放免费视频日本| 国产喷白浆一区二区三区| 国产亚洲第一区| 精品黑人一区二区三区国语馆| 日本亚洲视频在线| 国产成人精品视频在线观看| 五月天婷婷丁香| 欧美精品日本| 中文字幕一精品亚洲无线一区| 男人操女人动态图| 最近国产精品视频| 日韩电视剧在线观看免费网站| 日本wwwxx| 成人av在线播放| 欧美日韩国产影片| 亚洲天堂网一区| 国精产品一区一区三区四川| 91黄色免费版| 精品久久久噜噜噜噜久久图片| 888av在线视频| 亚洲午夜视频在线| 久久人人爽人人爽人人av| 永久免费网站在线| 亚洲靠逼com| 欧美a级黄色大片| h视频在线免费观看| 国产精品理论片在线观看| 色就是色欧美| 日本视频在线| 自拍偷在线精品自拍偷无码专区| 亚洲一区二区三区精品视频| 欧美尤物美女在线| 中文字幕综合网| 国产精品88久久久久久妇女| 呦呦在线视频| 精品久久久久久久久久久久久久| 青青青青草视频| 中国色在线日|韩| 日韩人在线观看| 国产精品无码一本二本三本色| 成人国产精品一区二区免费麻豆 | 国产精东传媒成人av电影| 欧美tk—视频vk| 国产男女猛烈无遮挡a片漫画| 色综合久久中文| 一个人www欧美| 激情无码人妻又粗又大| 99久久99久久精品国产片桃花| 久久天堂av综合合色| 欧美精品videos极品| 91久久午夜| 国产精品88a∨| 亚洲天堂中文网| 国产福利视频一区二区三区| 国产一区国产精品| 国产中文字幕在线| 亚洲精品中文字幕乱码三区| 9久久9毛片又大又硬又粗| 韩国成人在线| 日韩免费电影网站| 在线观看日本中文字幕| 亚洲最新av| 欧美一级免费视频| 国产精品嫩草影院桃色| zzijzzij亚洲日本少妇熟睡| 日韩精品最新在线观看| 日韩免费影院| 欧美午夜精品久久久久久孕妇| 国产又粗又猛又爽又黄| 九九亚洲精品| 欧美精品在线播放| 午夜久久久久久久久久影院| 国产一区二区三区av电影| 麻豆亚洲一区| 91福利国产在线观看菠萝蜜| 色偷偷88欧美精品久久久| 青青草原播放器| 久久99视频| 欧美国产在线视频| 中文字幕人妻色偷偷久久| 成人短视频下载| 一本久久a久久精品vr综合 | 欧美香蕉大胸在线视频观看| 日韩一级免费片| 综合伊思人在钱三区| 欧美精品在线免费观看| 中文在线免费看视频| 91日韩在线专区| www.av片| 97成人在线| 精品国内自产拍在线观看| 永久免费无码av网站在线观看| 国产成人综合在线播放| 亚洲日本精品| jizz亚洲女人高潮大叫| 亚洲精品视频网上网址在线观看| 免费在线观看一级片| 蜜桃精品视频在线| 欧美重口乱码一区二区| 色在线视频观看| 日韩大陆欧美高清视频区| 美女毛片在线观看| 黄色资源网久久资源365| 色女孩综合网| 456成人影院在线观看| 亚洲男人天堂网站| 中文字幕视频网| av影院午夜一区| 成品人视频ww入口| 成人av资源网址| 欧美黑人又粗大| www.97av.com| 亚洲精品乱码久久久久久黑人| 91视频这里只有精品| 色综合天天爱| 91免费国产网站| 国产1区在线| 欧美一区二区精品在线| 永久免费看黄网站| 国产盗摄女厕一区二区三区| 免费日韩在线观看| theporn国产在线精品| 久久久久国色av免费观看性色| 精品人妻一区二区三区麻豆91| 一区二区成人在线观看| 性色av蜜臀av浪潮av老女人| 99xxxx成人网| 欧美午夜免费| 精品视频在线一区二区在线| 中文字幕综合在线| 亚洲一区精品在线观看| 亚洲丝袜精品丝袜在线| 国产高潮失禁喷水爽到抽搐| 在线欧美不卡| 日韩精品一区二区三区四区五区 | 欧美不卡一区二区三区四区| 国产在线视频在线观看| 99国产一区二区三精品乱码| 久久久免费视频网站| 国产成人短视频在线观看| 国产精品激情av电影在线观看| 日本欧美在线视频免费观看| 在线不卡一区二区| 18精品爽视频在线观看| 99视频热这里只有精品免费| 青青在线免费观看视频| 国产精品麻豆久久| 国产视频一区二区三区四区| 亚洲第一影院| 久99久在线视频| 欧美日韩伦理片| 欧美精品在线观看一区二区| 久青草免费视频| 久久精品视频一区二区三区| jizz18女人| 18成人免费观看视频| 日本一区视频在线观看免费| 成人自拍视频| 欧美又大粗又爽又黄大片视频| 亚洲成人三级| 亚洲国产91精品在线观看| 亚洲图片欧美日韩| 一区二区三区不卡在线观看| 成人午夜福利一区二区| 国产一区二区三区免费在线观看| 5月婷婷6月丁香| 欧美丰满日韩| 欧美日韩在线精品| 一区二区三区四区精品视频| 国产精品久久久久久久av电影 | 日韩a在线观看| 欧美一区二区日韩一区二区| 亚洲第一网站在线观看| 一区二区三区日韩欧美精品| 国产又大又粗又爽的毛片| 国产精品996| 亚洲欧美在线精品| 香蕉精品999视频一区二区| 成年丰满熟妇午夜免费视频 | 成人av电影在线网| 天堂在线中文在线| 久久午夜影视| 九色自拍视频在线观看| 欧美高清日韩| 中文字幕一区二区三区有限公司| 免费观看久久av| 国产精品手机在线| 日本在线视频一区二区三区| 国产在线观看精品| 欧美暴力调教| 国产精品678| 亚洲承认视频| 热99在线视频| 国产在线天堂www网在线观看| 欧美乱大交xxxxx| 蜜芽在线免费观看| 在线成人激情黄色| 国产福利在线看| 亚洲美女又黄又爽在线观看| 天堂网在线中文| 欧美变态tickling挠脚心| 亚洲香蕉在线视频| 欧美性生活久久| 波多野结衣影片| 色屁屁一区二区| 99精品在线播放| 懂色av影视一区二区三区| 久久综合激情网| 夜夜精品视频一区二区| 久久久久久免费观看| 亚洲欧美另类综合偷拍| 国产一区二区播放| 艳妇臀荡乳欲伦亚洲一区| 国产精品三区在线观看| 一区二区在线观看视频在线观看| 日本a级片视频| 亚洲一区二区综合| 日本中文字幕免费| 天天综合色天天| 国产微拍精品一区| 欧美性生活大片免费观看网址| 无码人妻精品一区二区三区不卡 | 国产精品一区高清| 午夜精品视频在线观看一区二区| 欧美日韩国产在线观看网站| 天堂精品视频| 国产精品国产一区| 老司机午夜网站| 激情久久久久久| 国产精品无码一区二区在线| 久久久天天操| 精品999在线| 国产精品中文字幕欧美| 亚洲少妇中文字幕| 久久婷婷国产综合国色天香| 欧美成人短视频| 亚洲美腿欧美偷拍| 中文字幕亚洲精品在线| 欧洲生活片亚洲生活在线观看| 91精品在线视频观看| 欧美精品一区二区在线观看| 色就是色亚洲色图| 日韩在线视频线视频免费网站| gogogogo高清视频在线| 国产91对白在线播放| 成人免费一区| 成人av电影免费| 欧美禁忌电影| 亚洲免费视频播放| 亚洲精品人人| 2025韩国理伦片在线观看| 高清成人免费视频| 色哟哟精品观看| 一区二区日韩电影| 国产精品久久久久久久久久精爆| 欧美日本精品一区二区三区| 欧美少妇bbw| 色偷偷88888欧美精品久久久| xxx.xxx欧美| 国产精品自拍偷拍| youjizz亚洲| 中文字幕一区二区三区最新| 国产精品日韩| 麻豆精品国产传媒| 国产拍欧美日韩视频二区| 欧美三级 欧美一级| 日本道精品一区二区三区 | 亚洲视频国产视频| 18+激情视频在线| 日韩美女在线观看一区| jizz国产精品| 综合视频在线观看| 久热精品在线| 在线中文字日产幕| 国产精品福利一区| 久久久久久久久久影院| 欧美一区二区三区日韩视频| 久草在现在线| 97国产suv精品一区二区62| 伊人久久大香伊蕉在人线观看热v| 久久久久久草| 精品999网站| www.久久com| 国产精品人妖ts系列视频| 久久久国产高清| 欧美xxx久久| 国产理论在线观看| 国产精品亚洲欧美导航| 亚洲精品动态| 男人日女人视频网站| 国产91丝袜在线播放| 国产成人久久久久| 欧美精三区欧美精三区| 蝌蚪视频在线播放| 欧美在线激情视频| 欧美日韩一区二区三区不卡视频| 91嫩草国产丨精品入口麻豆| 国产真实乱子伦精品视频| 国产极品视频在线观看| 欧美视频中文字幕| 国产高清美女一级毛片久久| 国产成人精品在线播放| 亚洲三级精品| av动漫免费看| 久久久精品黄色| 国产真人无遮挡作爱免费视频| 日韩麻豆第一页| 欧美日韩精品免费观看视完整| 免费中文日韩| 鲁大师成人一区二区三区| www.自拍偷拍| 91高清在线观看| www.在线视频.com| 国产精自产拍久久久久久蜜| 日韩精品电影| 日日干日日操日日射| 亚洲三级在线观看| 精品国产亚洲AV| 欧美国产在线电影| 极品尤物一区| 青青草原av在线播放| 国产亚洲欧美日韩在线一区| 五月婷婷激情五月| 自拍视频国产精品| 日本一区二区三区播放| 91黄色在线看| 久久久久国产免费免费| 中文字幕乱码人妻二区三区| 日韩中文字幕视频在线| 久久视频免费| 亚洲熟妇无码一区二区三区| 久久婷婷一区二区三区| 艳妇乳肉豪妇荡乳av无码福利| 久久亚洲精品一区二区| 国产精品videossex| 免费无码av片在线观看| 国产精品天美传媒沈樵| av在线资源观看| 午夜美女久久久久爽久久| 美女少妇全过程你懂的久久| 色国产在线视频| 一区二区三区四区在线播放| 五月婷婷六月色| 国产精品视频自在线| 综合亚洲视频| 中国极品少妇videossexhd| 91电影在线观看| 性欧美高清come| 欧美在线视频一区二区三区| 国产最新精品精品你懂的| 亚洲国产精一区二区三区性色| 一本一本久久a久久精品牛牛影视| 国产aa精品| 国产aaa一级片| 亚洲欧美另类久久久精品| 午夜视频福利在线| 国产日韩欧美黄色| 亚洲区欧美区| 久久噜噜色综合一区二区| 日韩av在线影院| 久久99成人| 欧美精品成人网| 亚洲妇熟xx妇色黄| 瑟瑟视频在线| 久久精品国产精品青草色艺| 国产乱人伦精品一区二区在线观看| 二区视频在线观看| 久久99久久99精品免观看粉嫩| 狠狠色狠狠色综合婷婷tag| 免费啪视频在线观看| 欧美日韩日日骚| 校园春色亚洲色图|