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

Java界神秘技術(shù)ClassLoader,吃透它看這一篇就夠了

新聞 前端
ClassLoader 是 Java 屆神秘的技術(shù)之一,無數(shù)人被它傷透了腦筋,摸不清門道究竟在哪里。本文我?guī)ёx者徹底吃透 ClassLoader,以后其它的相關(guān)文章你們可以不必再細(xì)看了。

ClassLoader 是 Java 屆神秘的技術(shù)之一,無數(shù)人被它傷透了腦筋,摸不清門道究竟在哪里。網(wǎng)上的文章也是一篇又一篇,經(jīng)過本人的親自鑒定,絕大部分內(nèi)容都是在誤導(dǎo)別人。本文我?guī)ёx者徹底吃透 ClassLoader,以后其它的相關(guān)文章你們可以不必再細(xì)看了。

ClassLoader 做什么的?

顧名思義,它是用來加載 Class 的。它負(fù)責(zé)將 Class 的字節(jié)碼形式轉(zhuǎn)換成內(nèi)存形式的 Class 對(duì)象。字節(jié)碼可以來自于磁盤文件 *.class,也可以是 jar 包里的 *.class,也可以來自遠(yuǎn)程服務(wù)器提供的字節(jié)流,字節(jié)碼的本質(zhì)就是一個(gè)字節(jié)數(shù)組 []byte,它有特定的復(fù)雜的內(nèi)部格式。

Java界最神秘技術(shù)ClassLoader,吃透它看這一篇就夠了

有很多字節(jié)碼加密技術(shù)就是依靠定制 ClassLoader 來實(shí)現(xiàn)的。先使用工具對(duì)字節(jié)碼文件進(jìn)行加密,運(yùn)行時(shí)使用定制的 ClassLoader 先解密文件內(nèi)容再加載這些解密后的字節(jié)碼。每個(gè) Class 對(duì)象的內(nèi)部都有一個(gè) classLoader 字段來標(biāo)識(shí)自己是由哪個(gè) ClassLoader 加載的。ClassLoader 就像一個(gè)容器,里面裝了很多已經(jīng)加載的 Class 對(duì)象。

  1. class Class<T> { 
  2.  ... 
  3.  private final ClassLoader classLoader; 
  4.  ... 

延遲加載

JVM 運(yùn)行并不是一次性加載所需要的全部類的,它是按需加載,也就是延遲加載。程序在運(yùn)行的過程中會(huì)逐漸遇到很多不認(rèn)識(shí)的新類,這時(shí)候就會(huì)調(diào)用 ClassLoader 來加載這些類。加載完成后就會(huì)將 Class 對(duì)象存在 ClassLoader 里面,下次就不需要重新加載了。

比如你在調(diào)用某個(gè)類的靜態(tài)方法時(shí),首先這個(gè)類肯定是需要被加載的,但是并不會(huì)觸及這個(gè)類的實(shí)例字段,那么實(shí)例字段的類別 Class 就可以暫時(shí)不必去加載,但是它可能會(huì)加載靜態(tài)字段相關(guān)的類別,因?yàn)殪o態(tài)方法會(huì)訪問靜態(tài)字段。而實(shí)例字段的類別需要等到你實(shí)例化對(duì)象的時(shí)候才可能會(huì)加載。

各司其職

JVM 運(yùn)行實(shí)例中會(huì)存在多個(gè) ClassLoader,不同的 ClassLoader 會(huì)從不同的地方加載字節(jié)碼文件。它可以從不同的文件目錄加載,也可以從不同的 jar 文件中加載,也可以從網(wǎng)絡(luò)上不同的靜態(tài)文件服務(wù)器來下載字節(jié)碼再加載。

JVM 中內(nèi)置了三個(gè)重要的 ClassLoader,分別是 BootstrapClassLoader、ExtensionClassLoader 和 AppClassLoader。

BootstrapClassLoader 負(fù)責(zé)加載 JVM 運(yùn)行時(shí)核心類,這些類位于 $JAVA_HOME/lib/rt.jar 文件中,我們常用內(nèi)置庫 java.xxx.* 都在里面,比如 java.util.、java.io.、java.nio.、java.lang. 等等。這個(gè) ClassLoader 比較特殊,它是由 C 代碼實(shí)現(xiàn)的,我們將它稱之為「根加載器」。

ExtensionClassLoader 負(fù)責(zé)加載 JVM 擴(kuò)展類,比如 swing 系列、內(nèi)置的 js 引擎、xml 解析器 等等,這些庫名通常以 javax 開頭,它們的 jar 包位于 $JAVA_HOME/lib/ext/*.jar 中,有很多 jar 包。

AppClassLoader 才是直接面向我們用戶的加載器,它會(huì)加載 Classpath 環(huán)境變量里定義的路徑中的 jar 包和目錄。我們自己編寫的代碼以及使用的第三方 jar 包通常都是由它來加載的。

那些位于網(wǎng)絡(luò)上靜態(tài)文件服務(wù)器提供的 jar 包和 class文件,jdk 內(nèi)置了一個(gè) URLClassLoader,用戶只需要傳遞規(guī)范的網(wǎng)絡(luò)路徑給構(gòu)造器,就可以使用 URLClassLoader 來加載遠(yuǎn)程類庫了。URLClassLoader 不但可以加載遠(yuǎn)程類庫,還可以加載本地路徑的類庫,取決于構(gòu)造器中不同的地址形式。ExtensionClassLoader 和 AppClassLoader 都是 URLClassLoader 的子類,它們都是從本地文件系統(tǒng)里加載類庫。

AppClassLoader 可以由 ClassLoader 類提供的靜態(tài)方法 getSystemClassLoader() 得到,它就是我們所說的「系統(tǒng)類加載器」,我們用戶平時(shí)編寫的類代碼通常都是由它加載的。當(dāng)我們的 main 方法執(zhí)行的時(shí)候,這***個(gè)用戶類的加載器就是 AppClassLoader。

ClassLoader 傳遞性

程序在運(yùn)行過程中,遇到了一個(gè)未知的類,它會(huì)選擇哪個(gè) ClassLoader 來加載它呢?虛擬機(jī)的策略是使用調(diào)用者 Class 對(duì)象的 ClassLoader 來加載當(dāng)前未知的類。何為調(diào)用者 Class 對(duì)象?就是在遇到這個(gè)未知的類時(shí),虛擬機(jī)肯定正在運(yùn)行一個(gè)方法調(diào)用(靜態(tài)方法或者實(shí)例方法),這個(gè)方法掛在哪個(gè)類上面,那這個(gè)類就是調(diào)用者 Class 對(duì)象。前面我們提到每個(gè) Class 對(duì)象里面都有一個(gè) classLoader 屬性記錄了當(dāng)前的類是由誰來加載的。

因?yàn)?ClassLoader 的傳遞性,所有延遲加載的類都會(huì)由初始調(diào)用 main 方法的這個(gè) ClassLoader 全全負(fù)責(zé),它就是 AppClassLoader。

雙親委派

前面我們提到 AppClassLoader 只負(fù)責(zé)加載 Classpath 下面的類庫,如果遇到?jīng)]有加載的系統(tǒng)類庫怎么辦,AppClassLoader 必須將系統(tǒng)類庫的加載工作交給 BootstrapClassLoader 和 ExtensionClassLoader 來做,這就是我們常說的「雙親委派」。

Java界最神秘技術(shù)ClassLoader,吃透它看這一篇就夠了

AppClassLoader 在加載一個(gè)未知的類名時(shí),它并不是立即去搜尋 Classpath,它會(huì)首先將這個(gè)類名稱交給 ExtensionClassLoader 來加載,如果 ExtensionClassLoader 可以加載,那么 AppClassLoader 就不用麻煩了。否則它就會(huì)搜索 Classpath 。

而 ExtensionClassLoader 在加載一個(gè)未知的類名時(shí),它也并不是立即搜尋 ext 路徑,它會(huì)首先將類名稱交給 BootstrapClassLoader 來加載,如果 BootstrapClassLoader 可以加載,那么 ExtensionClassLoader 也就不用麻煩了。否則它就會(huì)搜索 ext 路徑下的 jar 包。

這三個(gè) ClassLoader 之間形成了級(jí)聯(lián)的父子關(guān)系,每個(gè) ClassLoader 都很懶,盡量把工作交給父親做,父親干不了了自己才會(huì)干。每個(gè) ClassLoader 對(duì)象內(nèi)部都會(huì)有一個(gè) parent 屬性指向它的父加載器。

  1. class ClassLoader { 
  2.  ... 
  3.  private final ClassLoader parent; 
  4.  ... 

值得注意的是圖中的 ExtensionClassLoader 的 parent 指針畫了虛線,這是因?yàn)樗?parent 的值是 null,當(dāng) parent 字段是 null 時(shí)就表示它的父加載器是「根加載器」。如果某個(gè) Class 對(duì)象的 classLoader 屬性值是 null,那么就表示這個(gè)類也是「根加載器」加載的。注意這里的 parent 不是 super 不是父類,只是 ClassLoader 內(nèi)部的字段。

Class.forName

當(dāng)我們?cè)谑褂?jdbc 驅(qū)動(dòng)時(shí),經(jīng)常會(huì)使用 Class.forName 方法來動(dòng)態(tài)加載驅(qū)動(dòng)類。

  1. Class.forName("com.mysql.cj.jdbc.Driver"); 

其原理是 mysql 驅(qū)動(dòng)的 Driver 類里有一個(gè)靜態(tài)代碼塊,它會(huì)在 Driver 類被加載的時(shí)候執(zhí)行。這個(gè)靜態(tài)代碼塊會(huì)將 mysql 驅(qū)動(dòng)實(shí)例注冊(cè)到全局的 jdbc 驅(qū)動(dòng)管理器里。

  1. class Driver { 
  2.  static { 
  3.  try { 
  4.  java.sql.DriverManager.registerDriver(new Driver()); 
  5.  } catch (SQLException E) { 
  6.  throw new RuntimeException("Can't register driver!"); 
  7.  } 
  8.  } 
  9.  ... 

forName 方法同樣也是使用調(diào)用者 Class 對(duì)象的 ClassLoader 來加載目標(biāo)類。不過 forName 還提供了多參數(shù)版本,可以指定使用哪個(gè) ClassLoader 來加載。

  1. Class<?> forName(String name, boolean initialize, ClassLoader cl) 

通過這種形式的 forName 方法可以突破內(nèi)置加載器的限制,通過使用自定類加載器允許我們自由加載其它任意來源的類庫。根據(jù) ClassLoader 的傳遞性,目標(biāo)類庫傳遞引用到的其它類庫也將會(huì)使用自定義加載器加載。

自定義加載器

ClassLoader 里面有三個(gè)重要的方法 loadClass()、findClass() 和 defineClass()。

loadClass() 方法是加載目標(biāo)類的入口,它首先會(huì)查找當(dāng)前 ClassLoader 以及它的雙親里面是否已經(jīng)加載了目標(biāo)類,如果沒有找到就會(huì)讓雙親嘗試加載,如果雙親都加載不了,就會(huì)調(diào)用 findClass() 讓自定義加載器自己來加載目標(biāo)類。ClassLoader 的 findClass() 方法是需要子類來覆蓋的,不同的加載器將使用不同的邏輯來獲取目標(biāo)類的字節(jié)碼。拿到這個(gè)字節(jié)碼之后再調(diào)用 defineClass() 方法將字節(jié)碼轉(zhuǎn)換成 Class 對(duì)象。下面我使用偽代碼表示一下基本過程:

  1. class ClassLoader { 
  2.  // 加載入口,定義了雙親委派規(guī)則 
  3.  Class loadClass(String name) { 
  4.  // 是否已經(jīng)加載了 
  5.  Class t = this.findFromLoaded(name); 
  6.  if(t == null) { 
  7.  // 交給雙親 
  8.  t = this.parent.loadClass(name) 
  9.  } 
  10.  if(t == null) { 
  11.  // 雙親都不行,只能靠自己了 
  12.  t = this.findClass(name); 
  13.  } 
  14.  return t; 
  15.  } 
  16.   
  17.  // 交給子類自己去實(shí)現(xiàn) 
  18.  Class findClass(String name) { 
  19.  throw ClassNotFoundException(); 
  20.  } 
  21.   
  22.  // 組裝Class對(duì)象 
  23.  Class defineClass(byte[] code, String name) { 
  24.  return buildClassFromCode(code, name); 
  25.  } 
  26. class CustomClassLoader extends ClassLoader { 
  27.  Class findClass(String name) { 
  28.  // 尋找字節(jié)碼 
  29.  byte[] code = findCodeFromSomewhere(name); 
  30.  // 組裝Class對(duì)象 
  31.  return this.defineClass(code, name); 
  32.  } 

自定義類加載器不易破壞雙親委派規(guī)則,不要輕易覆蓋 loadClass 方法。否則可能會(huì)導(dǎo)致自定義加載器無法加載內(nèi)置的核心類庫。在使用自定義加載器時(shí),要明確好它的父加載器是誰,將父加載器通過子類的構(gòu)造器傳入。如果父類加載器是 null,那就表示父加載器是「根加載器」。

  1. // ClassLoader 構(gòu)造器 
  2. protected ClassLoader(String name, ClassLoader parent); 

雙親委派規(guī)則可能會(huì)變成三親委派,四親委派,取決于你使用的父加載器是誰,它會(huì)一直遞歸委派到根加載器。

Class.forName vs ClassLoader.loadClass

這兩個(gè)方法都可以用來加載目標(biāo)類,它們之間有一個(gè)小小的區(qū)別,那就是 Class.forName() 方法可以獲取原生類型的 Class,而 ClassLoader.loadClass() 則會(huì)報(bào)錯(cuò)。

  1. Class<?> x = Class.forName("[I"); 
  2. System.out.println(x); 
  3. x = ClassLoader.getSystemClassLoader().loadClass("[I"); 
  4. System.out.println(x); 
  5. --------------------- 
  6. class [I 
  7. Exception in thread "main" java.lang.ClassNotFoundException: [I 
  8. ... 

鉆石依賴

項(xiàng)目管理上有一個(gè)著名的概念叫著「鉆石依賴」,是指軟件依賴導(dǎo)致同一個(gè)軟件包的兩個(gè)版本需要共存而不能沖突。

Java界最神秘技術(shù)ClassLoader,吃透它看這一篇就夠了

我們平時(shí)使用的 maven 是這樣解決鉆石依賴的,它會(huì)從多個(gè)沖突的版本中選擇一個(gè)來使用,如果不同的版本之間兼容性很糟糕,那么程序?qū)o法正常編譯運(yùn)行。Maven 這種形式叫「扁平化」依賴管理。使用 ClassLoader 可以解決鉆石依賴問題。不同版本的軟件包使用不同的 ClassLoader 來加載,位于不同 ClassLoader 中名稱一樣的類實(shí)際上是不同的類。下面讓我們使用 URLClassLoader 來嘗試一個(gè)簡單的例子,它默認(rèn)的父加載器是 AppClassLoader。

  1. $ cat ~/source/jcl/v1/Dep.java 
  2. public class Dep { 
  3.     public void print() { 
  4.         System.out.println("v1"); 
  5.     } 
  6. $ cat ~/source/jcl/v2/Dep.java 
  7. public class Dep { 
  8.  public void print() { 
  9.  System.out.println("v1"); 
  10.  } 
  11. $ cat ~/source/jcl/Test.java 
  12. public class Test { 
  13.     public static void main(String[] args) throws Exception { 
  14.         String v1dir = "file:///Users/qianwp/source/jcl/v1/"
  15.         String v2dir = "file:///Users/qianwp/source/jcl/v2/"
  16.         URLClassLoader v1 = new URLClassLoader(new URL[]{new URL(v1dir)}); 
  17.         URLClassLoader v2 = new URLClassLoader(new URL[]{new URL(v2dir)}); 
  18.          
  19.  Class<?> depv1Class = v1.loadClass("Dep"); 
  20.         Object depv1 = depv1Class.getConstructor().newInstance(); 
  21.         depv1Class.getMethod("print").invoke(depv1); 
  22.         Class<?> depv2Class = v2.loadClass("Dep"); 
  23.         Object depv2 = depv2Class.getConstructor().newInstance(); 
  24.         depv2Class.getMethod("print").invoke(depv2); 
  25.       
  26.  System.out.println(depv1Class.equals(depv2Class)); 
  27.  } 

在運(yùn)行之前,我們需要對(duì)依賴的類庫進(jìn)行編譯:

  1. $ cd ~/source/jcl/v1 
  2. $ javac Dep.java 
  3. $ cd ~/source/jcl/v2 
  4. $ javac Dep.java 
  5. $ cd ~/source/jcl 
  6. $ javac Test.java 
  7. $ java Test 
  8. v1 
  9. v2 
  10. false 

在這個(gè)例子中如果兩個(gè) URLClassLoader 指向的路徑是一樣的,下面這個(gè)表達(dá)式還是 false,因?yàn)榧词故峭瑯拥淖止?jié)碼用不同的 ClassLoader 加載出來的類都不能算同一個(gè)類。

  1. depv1Class.equals(depv2Class) 

我們還可以讓兩個(gè)不同版本的 Dep 類實(shí)現(xiàn)同一個(gè)接口,這樣可以避免使用反射的方式來調(diào)用 Dep 類里面的方法。

  1. Class<?> depv1Class = v1.loadClass("Dep"); 
  2. IPrint depv1 = (IPrint)depv1Class.getConstructor().newInstance(); 
  3. depv1.print() 

ClassLoader 固然可以解決依賴沖突問題,不過它也限制了不同軟件包的操作界面必須使用反射或接口的方式進(jìn)行動(dòng)態(tài)調(diào)用。Maven 沒有這種限制,它依賴于虛擬機(jī)的默認(rèn)懶惰加載策略,運(yùn)行過程中如果沒有顯示使用定制的 ClassLoader,那么從頭到尾都是在使用 AppClassLoader,而不同版本的同名類必須使用不同的 ClassLoader 加載,所以 Maven 不能***解決鉆石依賴。 如果你想知道有沒有開源的包管理工具可以解決鉆石依賴的,我推薦你了解一下 sofa-ark,它是螞蟻金服開源的輕量級(jí)類隔離框架。

分工與合作

這里我們重新理解一下 ClassLoader 的意義,它相當(dāng)于類的命名空間,起到了類隔離的作用。位于同一個(gè) ClassLoader 里面的類名是唯一的,不同的 ClassLoader 可以持有同名的類。ClassLoader 是類名稱的容器,是類的沙箱。

Java界最神秘技術(shù)ClassLoader,吃透它看這一篇就夠了

不同的 ClassLoader 之間也會(huì)有合作,它們之間的合作是通過 parent 屬性和雙親委派機(jī)制來完成的。parent 具有更高的加載優(yōu)先級(jí)。除此之外,parent 還表達(dá)了一種共享關(guān)系,當(dāng)多個(gè)子 ClassLoader 共享同一個(gè) parent 時(shí),那么這個(gè) parent 里面包含的類可以認(rèn)為是所有子 ClassLoader 共享的。這也是為什么 BootstrapClassLoader 被所有的類加載器視為祖先加載器,JVM 核心類庫自然應(yīng)該被共享。Thread.contextClassLoader

如果你稍微閱讀過 Thread 的源代碼,你會(huì)在它的實(shí)例字段中發(fā)現(xiàn)有一個(gè)字段非常特別。

  1. class Thread { 
  2.  ... 
  3.  private ClassLoader contextClassLoader; 
  4.   
  5.  public ClassLoader getContextClassLoader() { 
  6.  return contextClassLoader; 
  7.  } 
  8.   
  9.  public void setContextClassLoader(ClassLoader cl) { 
  10.  this.contextClassLoader = cl; 
  11.  } 
  12.  ... 

contextClassLoader「線程上下文類加載器」,這究竟是什么東西?

首先 contextClassLoader 是那種需要顯示使用的類加載器,如果你沒有顯示使用它,也就永遠(yuǎn)不會(huì)在任何地方用到它。你可以使用下面這種方式來顯示使用它。

Thread.currentThread().getContextClassLoader().loadClass(name);

這意味著如果你使用 forName(string name) 方法加載目標(biāo)類,它不會(huì)自動(dòng)使用 contextClassLoader。那些因?yàn)榇a上的依賴關(guān)系而懶惰加載的類也不會(huì)自動(dòng)使用 contextClassLoader來加載。

其次線程的 contextClassLoader 默認(rèn)是從父線程那里繼承過來的,所謂父線程就是創(chuàng)建了當(dāng)前線程的線程。程序啟動(dòng)時(shí)的 main 線程的 contextClassLoader 就是 AppClassLoader。這意味著如果沒有人工去設(shè)置,那么所有的線程的 contextClassLoader 都是 AppClassLoader。

那這個(gè) contextClassLoader 究竟是做什么用的?我們要使用前面提到了類加載器分工與合作的原理來解釋它的用途。

它可以做到跨線程共享類,只要它們共享同一個(gè) contextClassLoader。父子線程之間會(huì)自動(dòng)傳遞 contextClassLoader,所以共享起來將是自動(dòng)化的。

如果不同的線程使用不同的 contextClassLoader,那么不同的線程使用的類就可以隔離開來。

如果我們對(duì)業(yè)務(wù)進(jìn)行劃分,不同的業(yè)務(wù)使用不同的線程池,線程池內(nèi)部共享同一個(gè) contextClassLoader,線程池之間使用不同的 contextClassLoader,就可以很好的起到隔離保護(hù)的作用,避免類版本沖突。

如果我們不去定制 contextClassLoader,那么所有的線程將會(huì)默認(rèn)使用 AppClassLoader,所有的類都將會(huì)是共享的。

線程的 contextClassLoader 使用場(chǎng)合比較罕見,如果上面的邏輯晦澀難懂也不必過于計(jì)較。

JDK9 增加了模塊功能之后對(duì)類加載器的結(jié)構(gòu)設(shè)計(jì)做了一定程度的修改,不過類加載器的原理還是類似的,作為類的容器,它起到類隔離的作用,同時(shí)還需要依靠雙親委派機(jī)制來建立不同的類加載器之間的合作關(guān)系。

責(zé)任編輯:張燕妮 來源: 今日頭條
相關(guān)推薦

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項(xiàng)目

2020-02-18 16:20:03

Redis ANSI C語言日志型

2020-07-03 08:21:57

Java集合框架

2022-04-07 10:39:21

反射Java安全

2023-09-11 08:13:03

分布式跟蹤工具

2021-04-08 07:37:39

隊(duì)列數(shù)據(jù)結(jié)構(gòu)算法

2022-08-01 11:33:09

用戶分析標(biāo)簽策略

2019-05-14 09:31:16

架構(gòu)整潔軟件編程范式

2023-10-17 08:15:28

API前后端分離

2025-08-07 04:10:00

光模塊AI網(wǎng)絡(luò)

2024-09-23 08:00:00

消息隊(duì)列MQ分布式系統(tǒng)

2018-05-22 08:24:50

PythonPyMongoMongoDB

2020-07-06 08:06:00

Java模塊系統(tǒng)

2017-03-11 22:19:09

深度學(xué)習(xí)

2023-11-18 09:30:42

模型AI

2019-04-01 08:15:21

Java線程池多核處理器

2022-07-06 12:07:06

Python函數(shù)式編程

2023-11-06 07:21:13

內(nèi)存結(jié)構(gòu)Jvm

2019-04-01 10:43:59

Linux問題故障
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

中文精品无码中文字幕无码专区| 亚洲精品一区二区三区精华液| 日本一区二区免费看| 最近免费中文字幕大全免费版视频| 国产区精品区| 3atv一区二区三区| 黄色一级大片免费| 涩涩视频在线观看免费| 欧美aⅴ一区二区三区视频| 久久久久www| 国产艳俗歌舞表演hd| 国产另类xxxxhd高清| 中文字幕一区二区三| 国产精品传媒毛片三区| www.五月婷婷.com| 激情综合电影网| 色综久久综合桃花网| 国产激情第一页| 国产高清日韩| 色嗨嗨av一区二区三区| 波多野结衣与黑人| 在线免费看黄网站| 99麻豆久久久国产精品免费优播| 国产美女久久精品| 免费日韩一级片| 99久久综合| 亚洲午夜av电影| 国产在线不卡av| 欧美午夜网站| 欧美日韩国产综合一区二区三区 | 999久久久精品国产| 亚洲国产成人在线视频| 99视频在线观看视频| 激情亚洲影院在线观看| 午夜精品久久久久久久久久久| av电影一区二区三区| 成人欧美一区| 久久亚洲一区二区三区四区| 国产精品xxxx| 亚洲成人黄色片| 九色综合狠狠综合久久| 国产成人自拍视频在线观看| 欧美三级一区二区三区| 亚洲大片av| 欧美区在线播放| www色aa色aawww| 日韩精品一区二区三区免费观影| 精品中文字幕久久久久久| 久久久久99人妻一区二区三区 | 国产精品免费看一区二区三区| 91麻豆视频在线观看| 美女视频一区二区| 国产美女久久精品香蕉69| 中文字字幕在线中文乱码| 日韩精品亚洲专区| 国产成人精品在线观看| 无码人妻丰满熟妇奶水区码| 老司机午夜精品视频| 日韩免费中文字幕| 波多野结衣毛片| 奇米色一区二区三区四区| 国产精品av电影| 又色又爽又黄无遮挡的免费视频| 日韩精品乱码免费| 国产精品偷伦视频免费观看国产| 中文字幕精品一区二区精| 麻豆国产精品777777在线| 国产欧美精品在线播放| 国产精品视频一区二区三区,| 九色综合狠狠综合久久| av一区和二区| 天堂影院在线| 国产欧美日韩不卡| 正在播放亚洲| 日韩三级免费| 都市激情亚洲色图| 91色国产在线| 国产高清亚洲| 日韩av在线直播| 韩国三级hd中文字幕| 欧美综合一区| 欧美福利视频网站| 五月婷婷开心网| 蜜臂av日日欢夜夜爽一区| 91亚洲国产成人精品性色| 欧美 日韩 国产 在线| 久久无码av三级| 中文字幕日韩精品一区二区| 欧洲一区二区三区| 日本精品免费观看高清观看| 日本免费色视频| 久久porn| 精品国产一区二区三区久久| 精品一区二区三区四| 日韩一区精品视频| 91九色在线观看| 欧美女优在线观看| 亚洲男同1069视频| 四虎永久在线精品无码视频| 日韩专区视频网站| 日韩成人高清在线| 国产三级aaa| 国产精品毛片| 91视频88av| 久久精品国产亚洲a∨麻豆| 亚洲欧美另类小说视频| 丝袜老师办公室里做好紧好爽| 亚洲精品自拍| 亚洲人成电影网站色| 欧美成人手机视频| 免费成人在线网站| 精品国产综合区久久久久久| 免费在线看a| 欧美性生交xxxxx久久久| 精品人妻一区二区三区免费| 免费成人结看片| 久久久噜噜噜久久| 国产美女裸体无遮挡免费视频| 26uuu久久综合| 91视频 - 88av| 96sao精品免费视频观看| 亚洲女人天堂色在线7777| 激情五月婷婷在线| 精品系列免费在线观看| 日本精品二区| 老司机深夜福利在线观看| 日韩一级成人av| 成人欧美一区二区三区黑人一| 美女黄色成人网| 国内视频一区| 24小时免费看片在线观看| 欧美精品在欧美一区二区少妇| www.中文字幕av| 国产精品社区| 国产一区国产精品| 日韩精品亚洲人成在线观看| 在线观看91av| 日本爱爱小视频| 麻豆精品视频在线| 图片区小说区区亚洲五月| 五月天av在线| 亚洲美女精品成人在线视频| 日韩成人一区二区三区| 成人午夜视频在线| www.av91| 精品无人区一区二区| 久久久午夜视频| 亚洲欧美强伦一区二区| 一区av在线播放| 在线播放第一页| 国内精品福利| 国产伦精品一区二区三区在线 | 免费的av网站| 一区二区三区四区五区精品视频 | 欧美做受喷浆在线观看| 亚洲毛片视频| 精品久久一区二区三区蜜桃| 女海盗2成人h版中文字幕| 亚洲精品在线91| 国产一区免费看| 国产精品三级电影| 午夜剧场在线免费观看| 欧美mv日韩| 亚洲一区制服诱惑| 免费毛片在线看片免费丝瓜视频 | 成人高潮免费视频| 久久激情综合| 先锋影音欧美| 中文幕av一区二区三区佐山爱| 久久久www成人免费精品| 国产免费黄色网址| 伊人一区二区三区| 人妻激情偷乱频一区二区三区| 宅男噜噜噜66一区二区| 久久久久久久久久久久久久久久av | 亚洲天堂777| 一区二区三区在线不卡| 日韩www视频| 日本午夜一区二区| 青青草免费在线视频观看| 成人搞黄视频| 国产精品都在这里| 成人影院在线看| 亚洲国产欧美一区二区三区久久| 欧美 日韩 精品| 中文字幕欧美一| 好男人香蕉影院| 日韩精品高清不卡| www国产无套内射com| 丝袜美腿一区二区三区动态图| 国产精品午夜视频| 福利小视频在线| 国产一区二区三区久久精品| va婷婷在线免费观看| 日韩欧美精品在线观看| 黄色片子在线观看| 久久亚洲春色中文字幕久久久| 青青草原国产在线视频| 亚洲国产精品一区| 亚洲一区二区三区免费看| 亚洲专区**| 国产欧美精品在线播放| √8天堂资源地址中文在线| 色香阁99久久精品久久久| 六月丁香综合网| 色屁屁一区二区| 久久久久久久久久综合| 久久精品一区二区| www.成人黄色| 日日摸夜夜添夜夜添国产精品 | caoporm免费视频在线| 日韩成人xxxx| 亚洲国产精品久久久久久久| 欧美吻胸吃奶大尺度电影 | 久久久久无码精品国产sm果冻| 高清成人在线观看| 久久久久xxxx| 可以看av的网站久久看| 免费高清一区二区三区| 久久免费大视频| 日韩精品欧美一区二区三区| 国产精品网在线观看| 91在线中文字幕| 福利一区二区| 日本精品久久久久久久| www.综合网.com| 美日韩精品视频免费看| 日本不卡视频| 在线日韩中文字幕| 秋霞av在线| 日韩国产中文字幕| 亚洲欧美激情在线观看| 精品少妇一区二区三区在线播放| 国产精品-色哟哟| 欧美日韩一区二区在线观看| 69国产精品视频免费观看| 亚洲成精国产精品女| 欧美黄色免费在线观看| 亚洲天堂福利av| 精品伦精品一区二区三区视频密桃| 91理论电影在线观看| av av在线| av亚洲精华国产精华精华| 国产av一区二区三区传媒| 国产精品一区二区视频| 日韩av福利在线观看| 精品无码三级在线观看视频| 伊人网在线综合| 六月丁香婷婷久久| 超碰在线97免费| 捆绑调教一区二区三区| 亚洲精品20p| 国产一区二区视频在线播放| 色婷婷一区二区三区在线观看| 久久99精品国产91久久来源| 精品综合久久久久| 国产一区二区三区国产| 毛片毛片毛片毛片毛| 国产乱一区二区| 中文字幕在线观看91| 成人激情校园春色| 在线免费播放av| 久久久久久日产精品| 免费看黄色的视频| 亚洲国产电影在线观看| 日韩免费av一区| 亚洲日本成人在线观看| 欧美又粗又大又长| 亚洲午夜久久久久久久久电影网| 日韩免费av片| 91福利在线导航| 亚洲影视一区二区| 日韩一区二区免费在线观看| 深爱五月激情五月| 亚洲视频欧美视频| 免费在线观看av网站| 美女国内精品自产拍在线播放| xxxx成人| 国产精品美女av| 国产一区二区三区黄网站| 国产精品日韩欧美一区二区三区| 亚洲区小说区图片区qvod按摩| 亚洲国产欧美不卡在线观看 | 欧美wwwwww| 色99中文字幕| 午夜精品电影| av天堂永久资源网| 激情文学综合插| 男男做爰猛烈叫床爽爽小说| 中文av字幕一区| 久久久久噜噜噜亚洲熟女综合| 欧美日韩中文字幕日韩欧美| 国产精品久久久午夜夜伦鲁鲁| 亚洲国产成人在线播放| 在线免费观看黄| 国产最新精品视频| 九九热这里有精品| 国产伦视频一区二区三区| 欧美精品一区二区三区中文字幕| 99亚洲国产精品| 日韩福利电影在线观看| 国产乱淫av麻豆国产免费| 欧美激情资源网| 日韩av一二三区| 欧美一区二区三区在线视频| 四虎在线视频| 欧美国产日韩二区| 精品福利在线| 欧美精品成人一区二区在线观看| 午夜欧美精品久久久久久久| 爱情岛论坛vip永久入口| 成人高清视频在线| 搜索黄色一级片| 在线一区二区视频| 无码国产精品高潮久久99| 久久精品91久久香蕉加勒比| 范冰冰一级做a爰片久久毛片| 国产福利久久| 小说区亚洲自拍另类图片专区| 欧美 日韩精品| 成人国产亚洲欧美成人综合网| 懂色av蜜臀av粉嫩av永久| 色综合久久综合中文综合网| 欧美一级在线免费观看| 久久躁狠狠躁夜夜爽| 狂野欧美性猛交xxxx| 欧美日韩国产精品一区二区| 亚洲精品男同| 午夜视频在线免费看| 亚洲私人影院在线观看| 在线播放国产一区| 中文字幕久久久av一区| 国产超碰精品| 日本一区二区三区免费看| 亚洲久久一区二区| 又色又爽又黄18网站| 亚洲精品乱码久久久久| 国产美女精品视频国产| 久久成人18免费网站| www.成人在线.com| 色中文字幕在线观看| 久久99精品久久久久久动态图| 中文字幕第20页| 色综合久久综合网欧美综合网 | www.色综合| 欧美高清xxx| 正在播放久久| 国产麻豆91精品| 日本中文字幕免费在线观看| 91精品国产乱| 欧美人体视频xxxxx| 国产精品久久久久久免费观看 | 91av视频在线播放| 欧亚精品一区| 国产淫片av片久久久久久| www国产成人免费观看视频 深夜成人网| 欧美精品亚洲精品日韩精品| 日韩激情在线视频| 另类专区亚洲| 亚洲一卡二卡三卡| 久草精品在线观看| 欧美人妻精品一区二区三区| 亚洲第一福利视频| 中文字幕人成乱码在线观看 | 91久久免费观看| 在线日本视频| 99国产盗摄| 香蕉视频成人在线观看| www亚洲色图| 91麻豆精品国产| av在线播放资源| 日韩成人av网站| 国产精品18久久久久| 日本三级欧美三级| 国产亚洲福利一区| 色诱色偷偷久久综合| 免费在线看黄色片| 91色porny蝌蚪| 91成年人视频| 久久人人爽国产| 欧美日一区二区| 农村末发育av片一区二区| 色综合av在线| 在线观看中文| 日本免费高清一区二区| 久久99精品久久久久久动态图| 国产真实乱人偷精品视频| 亚洲一区二区黄| 日本免费精品| 黄色片视频在线播放| 一区二区三区四区在线| 免费黄色在线视频网站| 91麻豆桃色免费看| 亚洲在线观看| 欧美在线视频第一页| 亚洲欧美日韩成人| 日韩欧美高清一区二区三区| aa在线免费观看| 一区二区三区中文字幕电影| 黄色片在线播放|