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

關于 Java 模塊系統,看這一篇就夠了

開發 后端
繼 2014 年 3 月 Java 8 發布之后,時隔 4 年,2018 年 9 月,Java 11 如期發布,其間間隔了 Java 9 和 Java 10 兩個非LTS(Long Term Support)版本。

 繼 2014 年 3 月 Java 8 發布之后,時隔 4 年,2018 年 9 月,Java 11 如期發布,其間間隔了 Java 9 和 Java 10 兩個非LTS(Long Term Support)版本。作為最新的LTS版本,相比 Java 8,Java 11 包含了模塊系統、改用 G1 作為默認 GC 算法、反應式流 Flow、新版 HttpClient 等諸多特性。作為 JDK 11 升級系列的第一篇,本文將介紹此次升級最重要的特性——模塊系統。

[[332350]]

1、模塊系統簡介

如果把 Java 8 比作單體應用,那么引入模塊系統之后,從 Java 9 開始,Java 就華麗的轉身為微服務。模塊系統,項目代號 Jigsaw,最早于 2008 年 8 月提出(比 Martin Fowler 提出微服務還早 6 年),2014 年跟隨 Java 9 正式進入開發階段,最終跟隨 Java 9 發布于 2017 年 9 月。

那么什么是模塊系統?官方的定義是A uniquely named, reusable group of related packages, as well as resources (such as images and XML files) and a module descriptor.如圖-1所示,模塊的載體是 jar 文件,一個模塊就是一個 jar 文件,但相比于傳統的 jar 文件,模塊的根目錄下多了一個module-info.class 文件,也即 module descriptor。 module descriptor 包含以下信息:

  • 模塊名稱
  • 依賴哪些模塊
  • 導出模塊內的哪些包(允許直接 import 使用)
  • 開放模塊內的哪些包(允許通過 Java 反射訪問)
  • 提供哪些服務
  • 依賴哪些服務

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

 

圖-1: Java 9 Module

也就是說,任意一個 jar 文件,只要加上一個合法的 module descriptor,就可以升級為一個模塊。這個看似微小的改變,到底可以帶來哪些好處?在我看來,至少帶來四方面的好處。

第一,原生的依賴管理。有了模塊系統,Java 可以根據 module descriptor計算出各個模塊間的依賴關系,一旦發現循環依賴,啟動就會終止。同時,由于模塊系統不允許不同模塊導出相同的包(即 split package,分裂包),所以在查找包時,Java 可以精準的定位到一個模塊,從而獲得更好的性能。

第二,精簡 JRE。引入模塊系統之后,JDK 自身被劃分為 94 個模塊(參見圖-2)。通過 Java 9 新增的 jlink 工具,開發者可以根據實際應用場景隨意組合這些模塊,去除不需要的模塊,生成自定義 JRE,從而有效縮小 JRE 大小。得益于此,JRE 11 的大小僅為 JRE 8 的 53%,從 218.4 MB縮減為 116.3 MB,JRE 中廣為詬病的巨型 jar 文件 rt.jar 也被移除。更小的 JRE 意味著更少的內存占用,這讓 Java 對嵌入式應用開發變得更友好。

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

 

圖-2: The Modular JDK

第三,更好的兼容性。自打 Java 出生以來,就只有 4 種包可見性,這讓 Java 對面向對象的三大特征之一封裝的支持大打折扣,類庫維護者對此叫苦不迭,只能一遍又一遍的通過各種文檔或者奇怪的命名來強調這些或者那些類僅供內部使用,擅自使用后果自負云云。Java 9 之后,利用 module descriptor 中的 exports 關鍵詞,模塊維護者就精準控制哪些類可以對外開放使用,哪些類只能內部使用,換句話說就是不再依賴文檔,而是由編譯器來保證。類可見性的細化,除了帶來更好的兼容性,也帶來了更好的安全性。

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

 

圖-3: Java Accessibility

第四,提升 Java 語言開發效率。Java 9 之后,Java 像開掛了一般,一改原先一延再延的風格,嚴格遵循每半年一個大版本的發布策略,從 2017 年 9 月到 2020 年 3 月,從 Java 9 到 Java 14,三年時間相繼發布了 6 個版本,無一延期,參見圖-4。這無疑跟模塊系統的引入有莫大關系。前文提到,Java 9 之后,JDK 被拆分為 94 個模塊,每個模塊有清晰的邊界(module descriptor)和獨立的單元測試,對于每個 Java 語言的開發者而言,每個人只需要關注其所負責的模塊,開發效率因此大幅提升。這其中的差別,就好比單體應用架構升級到微服務架構一般,版本迭代速度不快也難。

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

 

圖-4: Java SE Lifecycle

2、基礎篇

2.1 module descriptor

上面提到,模塊的核心在于 module descriptor,對應根目錄下的 module-info.class 文件,而這個 class 文件是由源代碼根目錄下的 module-info.java 編譯生成。Java 為 module-info.java 設計了專用的語法,包含 module、 requires、exports等多個關鍵詞(參見圖-5)。

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

 

圖-5: module-info.java 語法

語法解讀:

  • [open] module : 聲明一個模塊,模塊名稱應全局唯一,不可重復。加上 open 關鍵詞表示模塊內的所有包都允許通過 Java 反射訪問,模塊聲明體內不再允許使用 opens 語句。
  • requires [transitive] : 聲明模塊依賴,一次只能聲明一個依賴,如果依賴多個模塊,需要多次聲明。加上 transitive 關鍵詞表示傳遞依賴,比如模塊 A 依賴模塊 B,模塊 B 傳遞依賴模塊 C,那么模塊 A 就會自動依賴模塊 C,類似于 Maven。
  • exports [to [, ...]]: 導出模塊內的包(允許直接 import 使用),一次導出一個包,如果需要導出多個包,需要多次聲明。如果需要定向導出,可以使用 to 關鍵詞,后面加上模塊列表(逗號分隔)。
  • opens [to [, ...]]: 開放模塊內的包(允許通過 Java 反射訪問),一次開放一個包,如果需要開放多個包,需要多次聲明。如果需要定向開放,可以使用 to 關鍵詞,后面加上模塊列表(逗號分隔)。
  • provides with [, ...]: 聲明模塊提供的 Java SPI 服務,一次可以聲明多個服務實現類(逗號分隔)。
  • uses : 聲明模塊依賴的 Java SPI 服務,加上之后模塊內的代碼就可以通過 ServiceLoader.load(Class) 一次性加載所聲明的 SPI 服務的所有實現類。

2.2 -p & -m 參數

Java 9 引入了一系列新的參數用于編譯和運行模塊,其中最重要的兩個參數是 -p 和 -m。-p 參數指定模塊路徑,多個模塊之間用 “:”(Mac, Linux)或者 “;”(Windows)分隔,同時適用于 javac 命令和 java 命令,用法和Java 8 中的 -cp非常類似。-m 參數指定待運行的模塊主函數,輸入格式為模塊名/主函數所在的類名,僅適用于 java 命令。兩個參數的基本用法如下:

  • javac -p <module_path> <source>
  • java -p <module_path> -m <module>/<main_class>

2.3 Demo 示例

為了幫助你理解 module descriptor 語法和新的 Java 參數,我專門設計了一個示例工程,其內包含了 5 個模塊:

  • mod1 模塊: 主模塊,展示了使用服務實現類的兩種方式。
  • mod2a 模塊: 分別導出和開放了一個包,并聲明了兩個服務實現類。
  • mod2b 模塊: 聲明了一個未公開的服務實現類。
  • mod3 模塊: 定義 SPI 服務(IEventListener),并聲明了一個未公開的服務實現類。
  • mod4 模塊: 導出公共模型類。

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

圖-6: 包含 5 個模塊的示例工程

先來看一下主函數,方式 1 展示了直接使用 mod2 導出和開放的兩個 IEventListener 實現類,方式 2 展示了通過 Java SPI 機制使用所有的 IEventListener 實現類,無視其導出/開放與否。方式 2 相比 方式 1,多了兩行輸出,分別來自于 mod2b 和 mod3 通過 provides 關鍵詞提供的服務實現類。

  1. public class EventCenter { 
  2.  
  3.     public static void main(String[] args) throws ReflectiveOperationException { 
  4.         // 方式1:通過exports和opens 
  5.         System.out.println("Demo: Direct Mode"); 
  6.         var listeners = new ArrayList<IEventListener>(); 
  7.         // 使用導出類 
  8.         listeners.add(new EchoListener()); 
  9.         // 使用開放類 
  10.         // compile error: listeners.add(new ReflectEchoListener()); 
  11.         listeners.add((IEventListener<String>) Class.forName("mod2a.opens.ReflectEchoListener").getDeclaredConstructor().newInstance()); 
  12.         var event = Events.newEvent(); 
  13.         listeners.forEach(l -> l.onEvent(event)); 
  14.         System.out.println(); 
  15.  
  16.         // 方式2:通過SPI 
  17.         System.out.println("Demo: SPI Mode"); 
  18.         // 加載所有的IEventListener實現類,無視其導出/開放與否 
  19.         var listeners2 = ServiceLoader.load(IEventListener.class).stream().map(ServiceLoader.Provider::get).collect(Collectors.toList()); 
  20.         // compile error: listeners.add(new InternalEchoListener()); 
  21.         // compile error: listeners.add(new SpiEchoListener()); 
  22.         var event2 = Events.newEvent(); 
  23.         listeners2.forEach(l -> l.onEvent(event2)); 
  24.     } 

代碼-1: mod1.EventCenter.java

命令行下執行./build_mods.sh,得到輸出如下,結果和預期一致。

  1. Demo: Direct Mode 
  2. [echo] Event received: 68eb4671-c057-4bc2-9653-c31f5e3f72d2 
  3. [reflect echo] Event received: 68eb4671-c057-4bc2-9653-c31f5e3f72d2 
  4.  
  5. Demo: SPI Mode 
  6. [spi echo] Event received: 678d239a-77ef-4b7f-b7aa-e76041fcdf47 
  7. [echo] Event received: 678d239a-77ef-4b7f-b7aa-e76041fcdf47 
  8. [reflect echo] Event received: 678d239a-77ef-4b7f-b7aa-e76041fcdf47 
  9. [internal echo] Event received: 678d239a-77ef-4b7f-b7aa-e76041fcdf47 

代碼-2: EventCenter 結果輸出

3、進階篇

看到這里,相信創建和運行一個新的模塊應用對你而言已經不是問題了,可問題是老的 Java 8 應用怎么辦?別著急,我們先來了解兩個高級概念,未命名模塊(unnamed module)和自動模塊(automatic module)。

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

圖-7: 未命名模塊 vs 自動模塊

一個未經模塊化改造的 jar 文件是轉為未命名模塊還是自動模塊,取決于這個 jar 文件出現的路徑,如果是類路徑,那么就會轉為未命名模塊,如果是模塊路徑,那么就會轉為自動模塊。注意,自動模塊也屬于命名模塊的范疇,其名稱是模塊系統基于 jar 文件名自動推導得出的,比如 com.foo.bar-1.0.0.jar 文件推導得出的自動模塊名是 com.foo.bar。圖-7列舉了未命名模塊和自動模塊行為上的區別,除此之外,兩者還有一個關鍵區別,分裂包規則適用于自動模塊,但對未命名模塊無效,也即多個未命名模塊可以導出同一個包,但自動模塊不允許。

未命名模塊和自動模塊存在的意義在于,無論傳入的 jar 文件是否一個合法的模塊(包含 module descriptor),Java 內部都可以統一的以模塊的方式進行處理,這也是 Java 9 兼容老版本應用的架構原理。運行老版本應用時,所有 jar 文件都出現在類路徑下,也就是轉為未命名模塊,對于未命名模塊而言,默認導出所有包并且依賴所有模塊,因此應用可以正常運行。進一步的解讀可以參閱官方白皮書的相關章節。

基于未命名模塊和自動模塊,相應的就產生了兩種老版本應用的遷移策略,或者說模塊化策略。

3.1 Bottom-up 自底向上策略

第一種策略,叫做自底向上(bottom-up)策略,即根據 jar 包依賴關系(如果依賴關系比較復雜,可以使用 jdeps 工具進行分析),沿著依賴樹自底向上對 jar 包進行模塊化改造(在 jar 包的源代碼根目錄下添加合法的模塊描述文件 module-info.java)。初始時,所有 jar 包都是非模塊化的,全部置于類路徑下(轉為未命名模塊),應用以傳統方式啟動。然后,開始自底向上對 jar 包進行模塊化改造,改造完的 jar 包就移到模塊路徑下,這期間應用仍以傳統方式啟動。最后,等所有 jar 包都完成模塊化改造,應用改為 -m 方式啟動,這也標志著應用已經遷移為真正的 Java 9 應用。以上面的示例工程為例,

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

 

圖-8: Bottom-up模塊化策略

1.假設初始時,所有 jar 包都是非模塊化的,此時應用運行命令為:

  1. java -cp mod1.jar:mod2a.jar:mod2b.jar:mod3.jar:mod4.jar mod1.EventCenter 

對 mod3 和 mod4 進行模塊化改造。完成之后,此時 mod1, mod2a, mod2b 還是普通的 jar 文件,新的運行命令為:

  1. java -cp mod1.jar:mod2a.jar:mod2b.jar -p mod3.jar:mod4.jar --add-modules mod3,mod4 mod1.EventCenter 

對比上一步的命令,首先 mod3.jar 和 mod4.jar 從類路徑移到了模塊路徑,這個很好理解,因為這兩個 jar 包已經改造成了真正的模塊。其次,多了一個額外的參數 --add-modules mod3,mod4,這是為什么呢?這就要談到模塊系統的模塊發現機制了。

不管是編譯時,還是運行時,模塊系統首先都要確定一個或者多個根模塊(root module),然后從這些根模塊開始根據模塊依賴關系在模塊路徑中循環找出所有可觀察到的模塊(observable module),這些可觀察到的模塊加上類路徑下的 jar 文件最終構成了編譯時環境和運行時環境。那么根模塊是如何確定的呢?對于運行時而言,如果應用是通過 -m 方式啟動的,那么根模塊就是 -m 指定的主模塊;如果應用是通過傳統方式啟動的,那么根模塊就是所有的 java.* 模塊即 JRE(參見圖-2)。回到前面的例子,如果不加 --add-modules 參數,那么運行時環境中除了 JRE 就只有 mod1.jar、mod2a.jar、mod2b.jar,沒有 mod3、mod4 模塊,就會報 java.lang.ClassNotFoundException 異常。如你所想,--add-modules 參數的作用就是手動指定額外的根模塊,這樣應用就可以正常運行了。

3.接著完成 mod2a、mod2b 的模塊化改造,此時運行命令為:

java -cp mod1.jar -p mod2a.jar:mod2b.jar:mod3.jar:mod4.jar --add-modules mod2a,mod2b,mod4 mod1.EventCenter

由于 mod2a、mod2b 都依賴 mod3,所以 mod3 就不用加到 --add-modules 參數里了。

4.最后完成 mod1 的模塊化改造,最終運行命令就簡化為:

java -p mod1.jar:mod2a.jar:mod2b.jar:mod3.jar:mod4.jar -m mod1/mod1.EventCenter

注意此時應用是以 -m 方式啟動,并且指定了 mod1 為主模塊(也是根模塊),因此所有其他模塊根據依賴關系都會被識別為可觀察到的模塊并加入到運行時環境,應用可以正常運行。

3.2 Top-down 自上而下策略

自底向上策略很容易理解,實施路徑也很清晰,但它有一個隱含的假設,即所有 jar 包都是可以模塊化的,那如果其中有 jar 包無法進行模塊化改造(比如 jar 包是一個第三方類庫),怎么辦?別慌,我們再來看第二種策略,叫做自上而下(top-down)策略。

它的基本思路是,根據 jar 包依賴關系,從主應用開始,沿著依賴樹自上而下分析各個 jar 包模塊化改造的可能性,將 jar 包分為兩類,一類是可以改造的,一類是無法改造的。對于第一類,我們仍然采用自底向上策略進行改造,直至主應用完成改造,對于第二類,需要從一開始就放入模塊路徑,即轉為自動模塊。這里就要談一下自動模塊設計的精妙之處,首先,自動模塊會導出所有包,這樣就保證第一類 jar 包可以照常訪問自動模塊,其次,自動模塊依賴所有命名模塊,并且允許訪問所有未命名模塊的類(這一點很重要,因為除自動模塊之外,其它命名模塊是不允許訪問未命名模塊的類),這樣就保證自動模塊自身可以照常訪問其他類。等到主應用完成模塊化改造,應用的啟動方式就可以改為 -m方式。

還是以示例工程為例,假設 mod4 是一個第三方 jar 包,無法進行模塊化改造,那么最終改造完之后,雖然應用運行命令和之前一樣還是java -p mod1.jar:mod2a.jar:mod2b.jar:mod3.jar:mod4.jar -m mod1/mod1.EventCenter,但其中只有 mod1、mod2a、mod2b、mod3 是真正的模塊,mod4 未做任何改造,借由模塊系統轉為自動模塊。

 

「JDK 11」關于 Java 模塊系統,看這一篇就夠了

 

圖-9: Top-down模塊化策略

看上去很完美,不過等一下,如果有多個自動模塊,并且它們之間存在分裂包呢?前面提到,自動模塊和其它命名模塊一樣,需要遵循分裂包規則。對于這種情況,如果模塊化改造勢在必行,要么忍痛割愛精簡依賴只保留其中的一個自動模塊,要么自己動手豐衣足食 Hack 一個版本。當然,你也可以試試找到這些自動模塊的維護者們,讓他們 PK 一下決定誰才是這個分裂包的主人。

4、番外篇

有關模塊系統的介紹到這就基本結束了,簡單回顧一下,首先我介紹了什么是模塊、模塊化的好處,接著給出了定義模塊的語法,和編譯、運行模塊的命令,并輔以一個示例工程進行說明,最后詳細闡述了老版本應用模塊化改造的思路。現在我們再來看一些跟模塊系統比較相似的框架和工具,以進一步加深你對模塊系統的理解。

4.1 vs OSGi

說起模塊化,尤其在 Java 界,那么肯定繞不過 OSGi 這個模塊系統的鼻祖。OSGi 里的 bundle 跟模塊系統里的模塊非常相似,都是以 jar 文件的形式存在,每個 bundle 有自己的名稱,也會定義依賴的 bundle、導出的包、發布的服務等。所不同的是,OSGi bundle 可以定義版本,還有生命周期的概念,包括 installed、resolved、uninstalled、starting、active、stopping 6 種狀態,所有 bundle 都由 OSGi 容器進行管理,并且在同一個 OSGi 容器里面允許同時運行同一個 bundle 的多個版本,甚至每個 bundle 有各自獨立的 classloader。以上種種特性使得 OSGi 框架變得非常重,在微服務盛行的當下,越來越被邊緣化。

4.2 vs Maven

Maven 的依賴管理和模塊系統存在一些相似之處,Maven 里的 artifact 對應模塊 ,都是以 jar 文件的形式存在,有名稱,可以聲明傳遞依賴。不同之處在于,Maven artifact 支持版本,但缺少包一級的信息,也沒有服務的概念。如果 Java 一出生就帶有模塊系統,那么 Maven 的依賴管理大概率就會直接基于模塊系統來設計了。

4.3 vs ArchUnit

ArchUnit 在包可見性方面的控制能力和模塊系統相比,有過之而無不及,并且可以細化到類、方法、屬性這一級。但 ArchUnit 缺少模塊一級的控制,模塊系統的出現正好補齊了 ArchUnit 這一方面的短板,兩者相輔相成、相得益彰,以后落地架構規范也省了很多口水。

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2025-08-07 04:10:00

光模塊AI網絡

2017-03-11 22:19:09

深度學習

2020-07-03 08:21:57

Java集合框架

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項目

2020-02-18 16:20:03

Redis ANSI C語言日志型

2022-04-07 10:39:21

反射Java安全

2021-04-08 07:37:39

隊列數據結構算法

2022-08-01 11:33:09

用戶分析標簽策略

2023-09-11 08:13:03

分布式跟蹤工具

2019-05-14 09:31:16

架構整潔軟件編程范式

2024-09-23 08:00:00

消息隊列MQ分布式系統

2023-10-17 08:15:28

API前后端分離

2018-05-22 08:24:50

PythonPyMongoMongoDB

2023-11-18 09:30:42

模型AI

2020-11-22 08:32:29

人工智能AI

2022-07-06 12:07:06

Python函數式編程

2020-10-21 14:12:02

Single Sign

2022-05-19 08:28:19

索引數據庫

2019-04-01 10:43:59

Linux問題故障
點贊
收藏

51CTO技術棧公眾號

无码人妻丰满熟妇区五十路| 亚洲国产精品第一页| 9191在线观看| 国产精品69毛片高清亚洲| 欧美二区在线播放| 变态另类丨国产精品| 日本在线精品| 亚洲精品va在线观看| 精品无人区一区二区三区 | 性做久久久久久免费观看| 欧美精品一区二区视频| 国产视频第一页| 午夜影院日韩| 欧美乱大交xxxxx| 少妇久久久久久久久久| 亚洲精品国产九九九| 色婷婷久久99综合精品jk白丝| 国产av不卡一区二区| 午夜成人鲁丝片午夜精品| 久99久精品视频免费观看| 9.1国产丝袜在线观看| 日本少妇高清视频| 欧美黑人巨大videos精品| 欧美剧情电影在线观看完整版免费励志电影 | 日本波多野结衣在线| 免费高清在线视频一区·| 性色av一区二区三区在线观看| 中文字幕无码日韩专区免费| 久久91麻豆精品一区| 欧美videos大乳护士334| 中文字幕 91| 欧美极度另类| 欧美日韩国产精品一区二区三区四区 | 在线观看黄网址| 狠狠做六月爱婷婷综合aⅴ| 精品美女在线播放| 亚欧精品在线视频| 久久av影院| 午夜精品久久久久久久蜜桃app| 亚洲五码在线观看视频| 日本黄色片在线观看| 国产午夜亚洲精品午夜鲁丝片| 九9re精品视频在线观看re6| www.蜜臀av| 国产在线视视频有精品| 国产精品日日摸夜夜添夜夜av| aaa人片在线| 亚洲精品黄色| 97在线精品国自产拍中文| 欧美一级片在线视频| 日韩在线中文| 日韩在线观看免费av| 欧美激情 一区| 狠狠综合久久av一区二区蜜桃 | 3d动漫精品啪啪一区二区下载| 成人性生交大片免费看96| 日韩亚洲欧美高清| 免费黄视频在线观看| 视频二区欧美毛片免费观看| 日韩欧美亚洲国产精品字幕久久久 | 毛片无码国产| 欧美综合在线视频| youjizzxxxx18| 成人综合网站| 6080国产精品一区二区| www.51色.com| 我要色综合中文字幕| 欧美一级片在线观看| 熟妇无码乱子成人精品| av男人一区| 亚洲精品美女在线| www.中文字幕av| 成人在线免费观看视频| 亚洲最新中文字幕| 日本视频在线免费| 午夜激情一区| 77777少妇光屁股久久一区| 免费黄色网址在线| 免费人成在线不卡| 97netav| 香蕉av一区二区三区| 久久九九久久九九| 一本久久a久久精品vr综合| 日本成人在线播放| 亚洲一区中文日韩| 黑森林福利视频导航| 美女久久久久久| 精品欧美黑人一区二区三区| 欧美图片一区二区| 欧美hd在线| 97精品国产97久久久久久免费| 成人免费视频国产免费| 精品午夜久久福利影院| 国产综合色一区二区三区| 国产黄色在线播放| 一区二区三区精品| 北条麻妃av高潮尖叫在线观看| 国产精品免费精品自在线观看| 日韩成人久久久| 一级片黄色录像| 亚洲黄页一区| 成人网欧美在线视频| 婷婷国产在线| 亚洲精品成a人| 天天色综合天天色| 成人线上播放| 美女av一区二区三区 | 性欧美videoshd高清| 欧美体内谢she精2性欧美| 久久出品必属精品| 国产91精品对白在线播放| 欧美巨乳美女视频| 中国女人一级一次看片| 成人激情小说乱人伦| 国产91av视频在线观看| 卡通欧美亚洲| 欧美精品一区二区久久久| 中文字幕美女视频| 男女精品网站| 精品一区二区国产| av网站免费在线观看| 欧美在线free| 亚洲一区二区三区蜜桃| 尤物网精品视频| 亚洲最大av在线| 日本在线免费| 欧美伊人久久久久久久久影院 | 人人干人人干人人| 亚洲区小说区| 97香蕉超级碰碰久久免费的优势| 精品人妻一区二区三区四区不卡 | 亚洲欧美www| 日韩黄色一级大片| 成人亚洲一区二区一| 在线视频一二三区| 91麻豆精品国产综合久久久 | 老司机精品免费视频| 久久激情久久| 欧美亚洲另类久久综合| 色网在线免费观看| 日韩电影中文字幕在线观看| 国产一级视频在线播放| 国产成人精品亚洲日本在线桃色| 午夜啪啪福利视频| 精品国产乱码久久久久久樱花| 神马国产精品影院av| 超碰在线97观看| 欧美激情一二三区| 日日躁夜夜躁aaaabbbb| 日韩精品影视| 国产欧美日韩综合精品| 香蕉视频在线免费看| 欧美日韩电影在线| 一本一本久久a久久| 麻豆成人免费电影| 日韩第一页在线观看| 国产一区二区高清在线| 欧美成人免费视频| 狠狠人妻久久久久久综合麻豆| 亚洲一区二区欧美激情| 制服丝袜在线第一页| 日韩视频不卡| 日韩久久久久久久| 欧美电影在线观看网站| 操人视频在线观看欧美| av无码精品一区二区三区宅噜噜| 一区二区三区欧美日| 成人免费看片载| 亚洲三级免费| 日本一区视频在线播放| 人人精品久久| 欧美激情欧美狂野欧美精品 | 亚洲综合色婷婷在线观看| 欧美第一页在线| 人人妻人人玩人人澡人人爽| 91久久免费观看| 免费国产羞羞网站美图| 成人av网址在线观看| 人妻丰满熟妇av无码区app| 奇米影视亚洲| 亚洲字幕在线观看| 忘忧草在线日韩www影院| 中文字幕精品网| 丰满人妻熟女aⅴ一区| 色综合天天综合色综合av| 亚洲毛片亚洲毛片亚洲毛片| 国产成人亚洲综合a∨婷婷| 九色在线视频观看| 97欧美在线视频| 精品国产一区二区三区日日嗨| jizzjizz少妇亚洲水多| 欧美黄色免费网站| 高清日韩av电影| 精品不卡在线视频| 一级黄色免费看| 午夜精品久久久久久久99水蜜桃| 国产视频123区| 99久久精品免费| 91精产国品一二三产区别沈先生| 国产欧美大片| 先锋影音男人资源| 欧美人与拘性视交免费看| 99久久99久久精品国产片| 国产高清不卡| 欧美激情在线观看| 色开心亚洲综合| 日韩精品在线免费| av男人天堂网| 欧美高清视频www夜色资源网| 日本三级中文字幕| 亚洲丝袜精品丝袜在线| 亚洲av无码一区二区二三区| 国产91精品精华液一区二区三区 | 日韩在线国产精品| 水中色av综合| 精品国产人成亚洲区| 一级全黄裸体免费视频| 一本到不卡精品视频在线观看| 免看一级a毛片一片成人不卡| 日本一区二区三区四区| 色噜噜在线观看| 成人三级在线视频| www.51色.com| 精品亚洲欧美一区| 久久久国产欧美| 性感少妇一区| 国产精品333| 国产精品毛片| 国产精品久久中文字幕| 好看的av在线不卡观看| 久久精品女人天堂av免费观看 | 国产精品三级av| 国产麻豆天美果冻无码视频| 成人性生交大片免费看视频在线| 五月天激情播播| 久久精品国产99久久6| 成人一区二区三| 西西人体一区二区| 91专区在线观看| 日韩视频在线一区二区三区| av日韩一区二区三区| 午夜天堂精品久久久久| 手机看片日韩国产| 久久久久av| 日本三日本三级少妇三级66| 91成人影院| 欧美性视频在线播放| 日韩一区欧美| 熟妇熟女乱妇乱女网站| 99久久国产综合精品成人影院| 亚洲精品一品区二品区三品区| 国产麻豆一区二区三区精品视频| 久久久一本精品99久久精品| 婷婷综合福利| 日本精品一区二区三区不卡无字幕| 女厕嘘嘘一区二区在线播放| 日本一区二区三区在线视频| 欧美日韩色图| 一本一道久久a久久精品综合| 久久福利影院| 免费看污污视频| 国产精品hd| 亚洲 欧美 日韩 国产综合 在线| 国产美女一区| 最近免费中文字幕中文高清百度| 免费在线看成人av| 91女神在线观看| 国产乱子伦一区二区三区国色天香| 国产一级片中文字幕| 成人黄页在线观看| 麻豆av免费观看| 国产精品久久久久一区| 免费在线观看一级片| 性感美女久久精品| 久久久久99精品成人片三人毛片| 91福利小视频| 国产色综合视频| 亚洲激情自拍图| xxxxx日韩| 欧美国产日韩xxxxx| а√天堂中文资源在线bt| 国产不卡精品视男人的天堂| 亚洲一区导航| 精品国产乱码久久久久久108| 国产精品欧美在线观看| 熟女视频一区二区三区| 日韩午夜av| 日本在线一二三区| 成人av网站在线观看| 亚洲黄色网址大全| 亚洲午夜影视影院在线观看| 川上优av一区二区线观看| 高清精品视频| 亚洲精品二区| 亚洲精品精选| 思思久久精品视频| 99热精品国产| 爱爱视频免费在线观看| 日韩欧美aaa| 国产乱淫a∨片免费观看| 日韩成人网免费视频| 黄网站视频在线观看| 日本免费久久高清视频| 欧美成人一级| 午夜精品美女久久久久av福利| 国精品一区二区三区| 手机在线成人免费视频| 91亚洲男人天堂| 99热精品免费| 欧美网站一区二区| 图片区 小说区 区 亚洲五月| 久久精品美女视频网站| 亚洲日本天堂| 国产成人成网站在线播放青青| 日韩精品诱惑一区?区三区| 日本丰满少妇xxxx| 国产一区久久久| 精品一区二区6| 色哟哟欧美精品| 深爱五月激情五月| 成人444kkkk在线观看| 成人在线观看免费视频| 蜜桃欧美视频| 国产亚洲精品v| 欧美xxxxx精品| 亚洲午夜精品在线| 99久久精品免费看国产交换| 最近2019年手机中文字幕| 国产成人精品123区免费视频| 精品久久sese| 亚洲精品日本| 亚洲色图欧美日韩| 亚洲综合久久久| 亚洲经典一区二区| 久精品免费视频| 精品国产鲁一鲁****| 色哺乳xxxxhd奶水米仓惠香| 激情综合网av| 三级黄色录像视频| 欧美日韩电影在线播放| 青青青青在线| 91综合免费在线| 伊人久久大香线蕉精品组织观看| 狠狠操狠狠干视频| 中文字幕一区在线观看| 一区二区三区免费在线| 色吧影院999| 亚洲综合伊人| 综合视频在线观看| 精品亚洲欧美一区| 国产a免费视频| 精品少妇一区二区三区免费观看| 日韩经典av| 国外成人在线视频网站| 国产欧美日本| 欧美丰满美乳xxⅹ高潮www| 欧美曰成人黄网| 婷婷五月在线视频| 91系列在线播放| 国产一区视频在线观看免费| 日本性生活一级片| 欧美性生交大片免费| av网在线观看| 亚洲xxxx视频| 一区二区三区国产在线| 国产男男chinese网站| 欧美日韩中文字幕一区| 超碰电影在线播放| 国产精品日本一区二区| 久久亚洲不卡| 午夜爽爽爽男女免费观看| 欧美一区二区三区喷汁尤物| hd国产人妖ts另类视频| 欧美深深色噜噜狠狠yyy| 久国产精品韩国三级视频| 国产一二三四在线| 国产丝袜一区二区| 日本亚洲欧洲无免费码在线| 人人妻人人澡人人爽欧美一区| 91色九色蝌蚪| 中文字幕资源网| 欧美激情视频在线观看| 亚洲精品亚洲人成在线| www.亚洲自拍| 欧美午夜女人视频在线| 黄页视频在线播放| 裸体丰满少妇做受久久99精品| 久久91精品久久久久久秒播| 国产成人在线播放视频| 日韩中文字幕不卡视频| 9l视频自拍蝌蚪9l视频成人| 欧美日韩在线免费播放| 一级中文字幕一区二区| 国产日本在线| 国产经品一区二区| 日本不卡中文字幕| 日本学生初尝黑人巨免费视频| 中国人与牲禽动交精品| 国产精品任我爽爆在线播放| 国产福利在线免费|