精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲精品国产精品国自产观看| 久久精品视频在线播放| 337p粉嫩大胆噜噜噜鲁| 国产视频网址在线| 麻豆免费精品视频| 久久久久久久999| 在线免费看黄视频| 久久精品九色| 色综合久久88色综合天天6| 杨幂一区欧美专区| 人人妻人人澡人人爽人人欧美一区| 久久久久久亚洲精品杨幂换脸| www.日本久久久久com.| 91黄色免费视频| 高清一区二区中文字幕| 欧美视频在线视频| 91传媒免费视频| 邻居大乳一区二区三区| 国产高清精品网站| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 久久人91精品久久久久久不卡| 日本黄色网址大全| 日韩一区二区三区高清在线观看| 色一情一乱一乱一91av| 国产成人永久免费视频| 日韩在线资源| 国产欧美一二三区| 狠狠色噜噜狠狠色综合久 | 九九热线视频只有这里最精品| 亚洲女同一区二区| 五码日韩精品一区二区三区视频| 人人妻人人澡人人爽人人欧美一区 | 午夜久久久久久噜噜噜噜| 美女视频免费一区| 日本乱人伦a精品| 国产无遮挡又黄又爽又色| 99久久综合| 中文字幕日韩有码| 日韩人妻一区二区三区| 巨人精品**| 精品免费视频.| 在线成人精品视频| 亚洲精品tv| 欧美日本免费一区二区三区| 国产黄色特级片| 正在播放日韩精品| 精品国产成人av| 亚洲美免无码中文字幕在线| 欧美videos另类精品| 亚洲色欲色欲www| 在线视频精品一区| 日本精品在线| 亚洲色大成网站www久久九九| 亚洲高清在线观看一区| yw193.com尤物在线| 日本一区二区综合亚洲| 神马影院我不卡| av影片在线看| 国产欧美一区视频| 亚洲一区三区视频在线观看| 香蕉视频国产在线观看| 亚洲图片你懂的| 亚洲高清资源综合久久精品| 久久综合之合合综合久久| 亚洲欧洲综合另类| 欧美极品少妇无套实战| 国产又色又爽又黄刺激在线视频| 亚洲国产精品自拍| 99在线精品免费视频| 女厕盗摄一区二区三区| 黑人巨大精品欧美一区二区一视频| 凹凸国产熟女精品视频| 香蕉久久免费电影| 欧美日韩国产高清一区| 91大神免费观看| 卡通动漫国产精品| 国产亚洲精品美女久久久久| 手机在线免费看片| 亚洲无线视频| 国产精品电影在线观看| 国产精品无码久久av| 高清不卡一区二区| 免费电影一区| 免费av网站在线观看| 亚洲一区二区3| 国产免费人做人爱午夜视频| 欧美一级做一级爱a做片性| 日韩精品一区二区三区视频播放 | 日本黄色精品| 欧美大尺度在线观看| 免费毛片一区二区三区| 日本伊人色综合网| 岛国视频一区| 福利在线视频导航| 亚洲线精品一区二区三区八戒| 99精品免费在线观看| 97色婷婷成人综合在线观看| 日韩国产欧美区| 色婷婷在线视频观看| 日韩午夜在线| 91精品视频播放| 亚洲三级中文字幕| 亚洲人成在线观看一区二区| 乱妇乱女熟妇熟女网站| 91精品一区| 精品无人区太爽高潮在线播放| 免费看特级毛片| 亚洲专区在线| 动漫精品视频| 老司机精品影院| 色菇凉天天综合网| 国产人妻黑人一区二区三区| 天天综合一区| 日韩女优在线播放| 好吊色在线观看| 亚洲欧洲国产专区| 91热这里只有精品| 奇米影视777在线欧美电影观看| 日韩在线视频线视频免费网站| 国产小视频在线免费观看| 国产一区二区三区不卡在线观看| 日韩中文一区| 免费高潮视频95在线观看网站| 日韩视频国产视频| 亚洲一二三四五六区| 亚洲免费网址| 好看的日韩精品| 9999在线视频| 精品国产乱码久久久久久免费 | 国产视频欧美| 成人综合电影| 欧美性videos| 欧美日韩国产免费| 夜夜春很很躁夜夜躁| 亚洲欧美久久| 裸模一区二区三区免费| 欧美久久天堂| 亚洲精品电影在线观看| 亚洲国产精品午夜在线观看| 国产精品性做久久久久久| 一区二区三区欧美在线| 高清在线一区| 色综合影院在线| 自拍偷拍精品视频| 中文乱码免费一区二区| 五月天婷婷激情视频| 国产欧美一区二区精品久久久| 欧美一级视频免费在线观看| 天堂av网在线| 日本精品免费观看高清观看| 在线观看日本中文字幕| 日本在线不卡视频| 亚洲欧美日韩国产成人综合一二三区| 视频在线日韩| 中文字幕日韩视频| 国产精品一二三四五区| 亚洲精品综合在线| 欧美图片自拍偷拍| 好吊一区二区三区| 激情欧美一区二区三区中文字幕| 麻豆免费在线| 亚洲午夜女主播在线直播| 日本三级一区二区三区| 亚洲欧洲日韩一区二区三区| 欧美专区第二页| 99精品福利视频| 欧美激情专区| 不卡亚洲精品| 欧美丰满少妇xxxxx做受| 丁香六月天婷婷| 色综合天天视频在线观看| 波多野结衣av在线观看| 麻豆91小视频| 日韩美女爱爱视频| 亚洲国产国产| 成人欧美在线观看| 国产探花视频在线观看| 亚洲免费电影在线观看| 在线观看国产黄| 亚洲一区二区高清| 国产亚洲精品熟女国产成人| 精品亚洲成a人| 亚洲人成无码网站久久99热国产| 夜夜躁狠狠躁日日躁2021日韩| 国产欧美日韩视频| segui88久久综合| 国产亚洲精品成人av久久ww| 国产精品主播一区二区| 欧美日韩国产一中文字不卡 | 亚洲高清免费在线| 日韩乱码人妻无码中文字幕久久| 精品中文字幕一区二区小辣椒| av女优在线播放| 日韩在线第七页| 国产一区精品视频| 电影一区电影二区| 欧美精品电影在线| 91精品专区| 亚洲精品久久久久久久久久久久| 在线观看一二三区| 天天影视网天天综合色在线播放| 日韩av片在线免费观看| 成人激情视频网站| 日韩va在线观看| 噜噜噜久久亚洲精品国产品小说| 在线电影看在线一区二区三区| 欧美黄色影院| 成人女人免费毛片| а天堂中文最新一区二区三区| 欧美诱惑福利视频| 男女视频在线| 理论片在线不卡免费观看| 精品999视频| 日韩高清免费在线| 精品国精品国产自在久不卡| 欧美视频在线播放| 7799精品视频天天看| 亚洲不卡一区二区三区| 精品欧美一区二区久久久久| 中文字幕精品三区| 亚洲一区二区三区蜜桃| av在线播放成人| 国模大尺度视频| 另类人妖一区二区av| 黄色一级一级片| 六月丁香综合| 无码人妻精品一区二区三区在线| 欧美日韩99| 久久免费一级片| 亚洲香蕉av| 中文字幕色一区二区| 成人高清电影网站| 日韩videos| blacked蜜桃精品一区| 欧美日韩免费精品| 夜夜春成人影院| 欧洲亚洲一区| 国产精品入口久久| 日韩av电影免费在线| 九九热精品视频在线观看| 久草精品电影| 蜜桃成人av| 欧美日韩一区在线观看视频| 九色精品国产蝌蚪| 日韩激情久久| 色综合天天综合网中文字幕| 亚洲精品视频一二三| 欧美hentaied在线观看| 在线国产精品网| 久久久久午夜电影| 久久国产精品免费观看| 欧美在线三级| 国产中文字幕乱人伦在线观看| 激情综合激情| 狠狠97人人婷婷五月| 久久久久久色| 一本一道久久a久久综合蜜桃| 久久国产婷婷国产香蕉| 欧美污在线观看| 波多野结衣一区二区三区 | 精品成人影院| 亚洲一二三区在线| 欧美日本一区二区高清播放视频| 妺妺窝人体色777777| 免费视频一区二区三区在线观看| 热久久精品免费视频| 麻豆专区一区二区三区四区五区| 男人午夜视频在线观看| 成人精品鲁一区一区二区| 国产精品无码在线| 国产午夜精品久久| 成人在线观看高清| 亚洲成a天堂v人片| 无码人妻丰满熟妇精品| 欧美精品久久99| 黄色av免费观看| 国产一区二区三区网站| 成人影院在线观看| 91精品国产91久久久| 123成人网| 操一操视频一区| 香蕉久久99| 午夜探花在线观看| 香蕉久久夜色精品| av噜噜在线观看| 99久久精品国产导航| 一区二区三区在线播放视频| 亚洲风情在线资源站| 国产一级片免费视频| 日韩欧美区一区二| 国际av在线| 欧美激情女人20p| 日韩欧美一区二区三区免费观看| 91香蕉亚洲精品| 国产99久久精品一区二区300| 五月天在线免费视频| 国产精品丝袜xxxxxxx| 亚洲一二三不卡| 久久精品人人做人人综合| 欧美日韩免费一区二区| 在线观看免费亚洲| 欧美一级特黄aaaaaa大片在线观看| 国产性色av一区二区| 超碰在线网站| 亚洲一区制服诱惑| 精品一区二区三| 三上悠亚久久精品| 国产在线不卡一卡二卡三卡四卡| 无码人妻精品一区二区三应用大全| 亚洲色图视频网站| wwwwww在线观看| 日韩大片免费观看视频播放| 国产激情在线| 国产精品99久久久久久人| 国产精品qvod| 无码人妻aⅴ一区二区三区日本| 日韩av电影天堂| 中文字幕av网址| 天天影视涩香欲综合网| 国产成年妇视频| 久久精品一区中文字幕| 成人看片网页| 欧美午夜精品久久久久免费视| 亚洲电影av| 一级黄色片毛片| 一区二区三区在线观看欧美| 国产精品一区二区黑人巨大 | 成人精品一二三区| 色综合久久九月婷婷色综合| 婷婷丁香一区二区三区| 97国产精品视频人人做人人爱| 涩涩屋成人免费视频软件| 一区二区精品在线观看| 麻豆精品蜜桃视频网站| 亚洲AV无码成人精品区明星换面 | 国产女人18毛片水18精| 日韩小视频在线| 成人交换视频| 午夜精品区一区二区三| 日韩av一区二区三区| xxxx日本黄色| 欧美日韩综合在线| 午夜精品一区| 成人激情免费在线| 五月精品视频| 中文在线字幕观看| 亚洲国产成人av好男人在线观看| 懂色av一区二区三区四区| 欧美激情xxxxx| 老牛精品亚洲成av人片| 噜噜噜久久亚洲精品国产品麻豆| 91麻豆精品在线观看| 日韩欧美在线观看免费| 伊人久久综合97精品| 欧美v亚洲v综合v国产v仙踪林| 一区精品在线| 国产精品综合av一区二区国产馆| 九九热只有精品| 欧美精品一区男女天堂| 亚洲欧洲美洲av| 无遮挡亚洲一区| 国产一区二区成人久久免费影院| 欧美日韩大片在线观看| 亚洲国产精品久久久久秋霞不卡| 在线观看v片| 亚洲自拍的二区三区| 国产一区二区三区在线观看免费| 一区二区三区免费高清视频| 亚洲经典中文字幕| 在线成人视屏| mm131午夜| 91在线观看视频| 中文字幕777| 欧美日韩国产第一页| 日韩欧美在线精品| 91精品999| 午夜精品视频一区| 国产九九在线| 99re6在线| 日韩在线观看一区二区| 希岛爱理中文字幕| 亚洲美女福利视频网站| 成人97精品毛片免费看| 欧美激情 国产精品| 中文字幕中文字幕在线一区 | 波多野结衣小视频| 欧美精品中文字幕一区| 青青草久久爱| 性欧美在线视频| 黑人巨大精品欧美一区二区| 精品51国产黑色丝袜高跟鞋| 久久久久久久久久码影片| 老司机午夜精品| 综合网在线观看| 欧美大奶子在线| 日本一二区不卡| 久久久午夜精品福利内容| 88在线观看91蜜桃国自产| 一二三四视频在线中文| 粉嫩av一区二区三区天美传媒 |