日韩亚洲国产高清免费视频_国产精品2020观看久久_久久99精品福利久久久_我要看欧美精品一级毛片

 

關(guān)于Java類加載問(wèn)題我竟讓面試官啞口無(wú)言

發(fā)布時(shí)間:2023-07-07 06:07:26  |  來(lái)源:博客園  

學(xué)習(xí)類加載之前我們先看看從面試官的角度會(huì)問(wèn)哪些問(wèn)題?帶著問(wèn)題學(xué)習(xí)會(huì)更加高效。

直擊面試

  1. 看你簡(jiǎn)歷寫得熟悉 JVM,那你說(shuō)說(shuō)類的加載過(guò)程吧?
  2. 我們可以自定義一個(gè) String 類來(lái)使用嗎?
  3. 什么是類加載器,類加載器有哪些?這些類加載器都加載哪些文件?
  4. 多線程的情況下,類的加載為什么不會(huì)出現(xiàn)重復(fù)加載的情況?
  5. 什么是雙親委派機(jī)制?它有啥優(yōu)勢(shì)?可以打破這種機(jī)制嗎?

類加載子系統(tǒng)

類加載機(jī)制概念

Java 虛擬機(jī)把描述類的數(shù)據(jù)從 Class 文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的 Java 類型,這就是虛擬機(jī)的加載機(jī)制。Class 文件由類裝載器裝載后,在 JVM 中將形成一份描述 Class 結(jié)構(gòu)的元信息對(duì)象,通過(guò)該元信息對(duì)象可以獲知 Class 的結(jié)構(gòu)信息:如構(gòu)造函數(shù),屬性和方法等,Java 允許用戶借由這個(gè) Class 相關(guān)的元信息對(duì)象間接調(diào)用 Class 對(duì)象的功能,這里就是我們經(jīng)常能見到的 Class 類。

類加載子系統(tǒng)作用

  • 類加載子系統(tǒng)負(fù)責(zé)從文件系統(tǒng)或者網(wǎng)絡(luò)中加載 class 文件,class 文件在文件開頭有特定的文件標(biāo)識(shí)(0xCAFEBABE)
  • ClassLoader 只負(fù)責(zé) class 文件的加載。至于它是否可以運(yùn)行,則由 Execution Engine 決定
  • 加載的類信息存放于一塊稱為方法區(qū)的內(nèi)存空間。除了類的信息外,方法區(qū)中還存放- 運(yùn)行時(shí)常量池信息,可能還包括字
  • Class 對(duì)象是存放在堆區(qū)的

類加載器 ClassLoader 角色

  1. class file 存在于本地硬盤上,可以理解為設(shè)計(jì)師畫在紙上的模板,而最終這個(gè)模板在執(zhí)行的時(shí)候是要加載到JVM 當(dāng)中來(lái)根據(jù)這個(gè)文件實(shí)例化出 n 個(gè)一模一樣的實(shí)例
  2. class file 加載到 JVM 中,被稱為 DNA 元數(shù)據(jù)模板,放在方法區(qū)
  3. 在 .calss 文件 -> JVM -> 最終成為元數(shù)據(jù)模板,此過(guò)程就要一個(gè)運(yùn)輸工具(類裝載器),扮演一個(gè)快遞員的角色

類加載過(guò)程

類從被加載到虛擬機(jī)內(nèi)存中開始,到卸載出內(nèi)存為止,它的整個(gè)生命周期包括:加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用和卸載七個(gè)階段。(驗(yàn)證、準(zhǔn)備和解析又統(tǒng)稱為連接,為了支持 Java 語(yǔ)言的運(yùn)行時(shí)綁定,所以解析階段也可以是在初始化之后進(jìn)行的。以上順序都只是說(shuō)開始的順序,實(shí)際過(guò)程中是交叉的混合式進(jìn)行的,加載過(guò)程中可能就已經(jīng)開始驗(yàn)證了)


(資料圖片僅供參考)

1. 加載(Loading):

  1. 通過(guò)一個(gè)類的全限定名獲取定義此類的二進(jìn)制字節(jié)流
  2. 將這個(gè)字節(jié)流所代表的的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)
  3. 在內(nèi)存中生成一個(gè)代表這個(gè)類的 java.lang.Class 對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問(wèn)入口

加載 .class 文件的方式

  • 從本地系統(tǒng)中直接加載
  • 通過(guò)網(wǎng)絡(luò)獲取,典型場(chǎng)景:Web Applet
  • 從 zip 壓縮文件中讀取,成為日后 jar、war 格式的基礎(chǔ)
  • 運(yùn)行時(shí)計(jì)算生成,使用最多的是:動(dòng)態(tài)代理技術(shù)
  • 由其他文件生成,比如 JSP 應(yīng)用
  • 從專有數(shù)據(jù)庫(kù)提取 .class 文件,比較少見
  • 從加密文件中獲取,典型的防 Class 文件被反編譯的保護(hù)措施

2. 連接(Linking)

驗(yàn)證(Verify)

  • 目的在于確保 Class 文件的字節(jié)流中包含信息符合當(dāng)前虛擬機(jī)要求,保證被加載類的正確性,不會(huì)危害虛擬機(jī)自身安全

  • 主要包括四種驗(yàn)證,文件格式驗(yàn)證,元數(shù)據(jù)驗(yàn)證,字節(jié)碼驗(yàn)證,符號(hào)引用驗(yàn)證

準(zhǔn)備(Prepare)

  • 為類變量分配內(nèi)存并且設(shè)置該類變量的默認(rèn)初始值,即零值
數(shù) 據(jù) 類 型 零 值
int0
long0L
short(short)0
char"\u0000"
byte(byte)0
booleanfalse
float0.0f
double0.0d
referencenull
  • 這里不包含用 final 修飾的 static,因?yàn)?final 在編譯的時(shí)候就會(huì)分配了,準(zhǔn)備階段會(huì)顯示初始化

  • 這里不會(huì)為實(shí)例變量分配初始化,類變量會(huì)分配在方法區(qū)中,而實(shí)例變量是會(huì)隨著對(duì)象一起分配到 Java 堆中

private static int i = 1;  //變量i在準(zhǔn)備階只會(huì)被賦值為0,初始化時(shí)才會(huì)被賦值為1private final static int j = 2;  //這里被final修飾的變量j,直接成為常量,編譯時(shí)就會(huì)被分配為2

解析(Resolve)

  • 將常量池內(nèi)的符號(hào)引用轉(zhuǎn)換為直接引用的過(guò)程
  • 事實(shí)上,解析操作往往會(huì)伴隨著 JVM 在執(zhí)行完初始化之后再執(zhí)行
  • 符號(hào)引用就是一組符號(hào)來(lái)描述所引用的目標(biāo)。符號(hào)引用的字面量形式明確定義在《Java虛擬機(jī)規(guī)范》的 Class文件格式中。直接引用就是直接指向目標(biāo)的指針、相對(duì)偏移量或一個(gè)間接定位到目標(biāo)的句柄
  • 解析動(dòng)作主要針對(duì)類或接口、字段、類方法、接口方法、方法類型等。對(duì)應(yīng)常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等

3. 初始化(Initialization)

  • 初始化階段就是執(zhí)行類構(gòu)造器方法 () 的過(guò)程
  • 此方法不需要定義,是 javac 編譯器自動(dòng)收集類中的所有類變量的賦值動(dòng)作和靜態(tài)代碼塊中的語(yǔ)句合并而來(lái)
  • 構(gòu)造器方法中指令按語(yǔ)句在源文件中出現(xiàn)的順序執(zhí)行
  • () 不同于類的構(gòu)造器(構(gòu)造器是虛擬機(jī)視角下的 ())
  • 若該類具有父類,JVM 會(huì)保證子類的 () 執(zhí)行前,父類的 () 已經(jīng)執(zhí)行完畢
  • 虛擬機(jī)必須保證一個(gè)類的 () 方法在多線程下被同步加鎖
public class ClassInitTest{  private static int num1 = 30;  static{    num1 = 10;    num2 = 10;     //num2寫在定義變量之前,為什么不會(huì)報(bào)錯(cuò)呢??    System.out.println(num2);   //這裡直接打印可以嗎? 報(bào)錯(cuò),非法的前向引用,可以賦值,但不可調(diào)用  }  private static int num2 = 20;  //num2在準(zhǔn)備階段就被設(shè)置了默認(rèn)初始值0,初始化階段又將10改為20  public static void main(String[] args){    System.out.println(num1);  //10    System.out.println(num2);   //20  }}

類的主動(dòng)使用和被動(dòng)使用

Java 程序?qū)︻惖氖褂梅绞椒譃椋褐鲃?dòng)使用和被動(dòng)使用。虛擬機(jī)規(guī)范規(guī)定有且只有 5 種情況必須立即對(duì)類進(jìn)行“初始化”,即類的主動(dòng)使用。

  • 創(chuàng)建類的實(shí)例、訪問(wèn)某個(gè)類或接口的靜態(tài)變量,或者對(duì)該靜態(tài)變量賦值、調(diào)用類的靜態(tài)方法(即遇到 new、getstatic、putstatic、invokestatic 這四條字節(jié)碼指令時(shí))
  • 反射
  • 初始化一個(gè)類的子類
  • Java 虛擬機(jī)啟動(dòng)時(shí)被標(biāo)明為啟動(dòng)類的類
  • JDK7 開始提供的動(dòng)態(tài)語(yǔ)言支持:java.lang.invoke.MethodHandle 實(shí)例的解析結(jié)果,REF_getStatic、REF_putStatic、REF_invokeStatic 句柄對(duì)應(yīng)的類沒有初始化,則初始化

除以上五種情況,其他使用 Java 類的方式被看作是對(duì)類的被動(dòng)使用,都不會(huì)導(dǎo)致類的初始化。

例如:

public class NotInitialization {    public static void main(String[] args) {         //只輸出SupperClass int 123,不會(huì)輸出SubClass init        //對(duì)于靜態(tài)字段,只有直接定義這個(gè)字段的類才會(huì)被初始化        System.out.println(SubClass.value);     }}class SuperClass {    static {        System.out.println("SupperClass init");    }    public static int value = 123;}class SubClass extends SuperClass {    static {        System.out.println("SubClass init");    }}

類加載器

  • JVM 支持兩種類型的類加載器,分別為引導(dǎo)類加載器(Bootstrap ClassLoader)和自定義類加載器(User-Defined ClassLoader)

  • 從概念上來(lái)講,自定義類加載器一般指的是程序中由開發(fā)人員自定義的一類類加載器,但是 Java 虛擬機(jī)規(guī)范卻沒有這么定義,而是將所有派生于抽象類 ClassLoader 的類加載器都劃分為自定義類加載器

啟動(dòng)類加載器(引導(dǎo)類加載器,Bootstrap ClassLoader)

  • 這個(gè)類加載使用 C/C++ 語(yǔ)言實(shí)現(xiàn),嵌套在 JVM 內(nèi)部
  • 它用來(lái)加載 Java 的核心庫(kù)(JAVA_HOME/jre/lib/rt.jar、resource.jar或sun.boot.class.path路徑下的內(nèi)容),用于提供 JVM 自身需要的類
  • 并不繼承自 java.lang.ClassLoader,沒有父加載器
  • 加載擴(kuò)展類和應(yīng)用程序類加載器,并指定為他們的父類加載器
  • 出于安全考慮,Bootstrap 啟動(dòng)類加載器只加載名為 java、Javax、sun 等開頭的類

擴(kuò)展類加載器(Extension ClassLoader)

  • Java 語(yǔ)言編寫,由 sun.misc.Launcher$ExtClassLoader 實(shí)現(xiàn)
  • 派生于 ClassLoader
  • 父類加載器為啟動(dòng)類加載器
  • 從 java.ext.dirs 系統(tǒng)屬性所指定的目錄中加載類庫(kù),或從 JDK 的安裝目錄的 jre/lib/ext 子目錄(擴(kuò)展目錄)下加載類庫(kù)。如果用戶創(chuàng)建的 JAR 放在此目錄下,也會(huì)自動(dòng)由擴(kuò)展類加載器加載

應(yīng)用程序類加載器(也叫系統(tǒng)類加載器,AppClassLoader)

  • Java 語(yǔ)言編寫,由 sun.misc.Lanucher$AppClassLoader 實(shí)現(xiàn)派生于 ClassLoader
  • 父類加載器為擴(kuò)展類加載器
  • 它負(fù)責(zé)加載環(huán)境變量 classpath 或系統(tǒng)屬性 java.class.path 指定路徑下的類庫(kù)
  • 該類加載是程序中默認(rèn)的類加載器,一般來(lái)說(shuō),Java 應(yīng)用的類都是由它來(lái)完成加載的通過(guò) ClassLoader#getSystemClassLoader() 方法可以獲取到該類加載器
public class ClassLoaderTest {    public static void main(String[] args) {        //獲取系統(tǒng)類加載器        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();        System.out.println(systemClassLoader);  //sun.misc.Launcher$AppClassLoader@135fbaa4        //獲取其上層:擴(kuò)展類加載器        ClassLoader extClassLoader = systemClassLoader.getParent();        System.out.println(extClassLoader);  //sun.misc.Launcher$ExtClassLoader@2503dbd3        //再獲取其上層:獲取不到引導(dǎo)類加載器        ClassLoader bootstrapClassLoader = extClassLoader.getParent();        System.out.println(bootstrapClassLoader);     //null        //對(duì)于用戶自定義類來(lái)說(shuō),默認(rèn)使用系統(tǒng)類加載器進(jìn)行加載,輸出和systemClassLoader一樣        ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();        System.out.println(classLoader);  //sun.misc.Launcher$AppClassLoader@135fbaa4        //String 類使用引導(dǎo)類加載器進(jìn)行加載。Java的核心類庫(kù)都使用引導(dǎo)類加載器進(jìn)行加載,所以也獲取不到        ClassLoader classLoader1 = String.class.getClassLoader();        System.out.println(classLoader1);  //null        //獲取BootstrapClassLoader可以加載的api的路徑        URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();        for (URL url : urls) {            System.out.println(url.toExternalForm());        }    }}

用戶自定義類加載器

在 Java 的日常應(yīng)用程序開發(fā)中,類的加載幾乎是由 3 種類加載器相互配合執(zhí)行的,在必要時(shí),我們還可以自定義類加載器,來(lái)定制類的加載方式

為什么要自定義類加載器?

  • 隔離加載類
  • 修改類加載的方式
  • 擴(kuò)展加載源(可以從數(shù)據(jù)庫(kù)、云端等指定來(lái)源加載類)
  • 防止源碼泄露(Java 代碼容易被反編譯,如果加密后,自定義加載器加載類的時(shí)候就可以先解密,再加載)

用戶自定義加載器實(shí)現(xiàn)步驟

  1. 開發(fā)人員可以通過(guò)繼承抽象類 java.lang.ClassLoader 類的方式,實(shí)現(xiàn)自己的類加載器,以滿足一些特殊的需求
  2. 在 JDK1.2 之前,在自定義類加載器時(shí),總會(huì)去繼承 ClassLoader 類并重寫 loadClass() 方法,從而實(shí)現(xiàn)自定義的類加載類,但是 JDK1.2 之后已經(jīng)不建議用戶去覆蓋 loadClass() 方式,而是建議把自定義的類加載邏輯寫在 findClass() 方法中
  3. 編寫自定義類加載器時(shí),如果沒有太過(guò)于復(fù)雜的需求,可以直接繼承 URLClassLoader 類,這樣就可以避免自己去編寫 findClass() 方法及其獲取字節(jié)碼流的方式,使自定義類加載器編寫更加簡(jiǎn)潔

ClassLoader 常用方法

ClassLoader 類,是一個(gè)抽象類,其后所有的類加載器都繼承自 ClassLoader(不包括啟動(dòng)類加載器)

方法描述
getParent()返回該類加載器的超類加載器
loadClass(String name)加載名稱為name的類,返回java.lang.Class類的實(shí)例
findClass(String name)
findLoadedClass(String name)查找名稱為name的已經(jīng)被加載過(guò)的類,返回java.lang.Class類的實(shí)例
defineClass(String name, byte[] b, int off, int len)把字節(jié)數(shù)組b中內(nèi)容轉(zhuǎn)換為一個(gè)Java類,返回java.lang.Class類的實(shí)例
resolveClass(Class c)連接指定的一個(gè)Java類

對(duì)類加載器的引用

JVM 必須知道一個(gè)類型是由啟動(dòng)加載器加載的還是由用戶類加載器加載的。如果一個(gè)類型是由用戶類加載器加載的,那么 JVM 會(huì)將這個(gè)類加載器的一個(gè)引用作為類型信息的一部分保存在方法區(qū)中。當(dāng)解析一個(gè)類型到另一個(gè)類型的引用的時(shí)候,JVM 需要保證這兩個(gè)類型的類加載器是相同的。

雙親委派機(jī)制

Java 虛擬機(jī)對(duì) class 文件采用的是按需加載的方式,也就是說(shuō)當(dāng)需要使用該類的時(shí)候才會(huì)將它的 class 文件加載到內(nèi)存生成 class 對(duì)象。而且加載某個(gè)類的 class 文件時(shí),Java 虛擬機(jī)采用的是雙親委派模式,即把請(qǐng)求交給父類處理,它是一種任務(wù)委派模式。

工作過(guò)程

  • 如果一個(gè)類加載器收到了類加載請(qǐng)求,它并不會(huì)自己先去加載,而是把這個(gè)請(qǐng)求委托給父類的加載器去執(zhí)行;
  • 如果父類加載器還存在其父類加載器,則進(jìn)一步向上委托,依次遞歸,請(qǐng)求最終將到達(dá)頂層的啟動(dòng)類加載器;
  • 如果父類加載器可以完成類加載任務(wù),就成功返回,倘若父類加載器無(wú)法完成此加載任務(wù),子加載器才會(huì)嘗試自己去加載,這就是雙親委派模式

優(yōu)勢(shì)

  • 避免類的重復(fù)加載,JVM 中區(qū)分不同類,不僅僅是根據(jù)類名,相同的 class 文件被不同的 ClassLoader 加載就屬于兩個(gè)不同的類(比如,Java中的Object類,無(wú)論哪一個(gè)類加載器要加載這個(gè)類,最終都是委派給處于模型最頂端的啟動(dòng)類加載器進(jìn)行加載,如果不采用雙親委派模型,由各個(gè)類加載器自己去加載的話,系統(tǒng)中會(huì)存在多種不同的 Object 類)
  • 保護(hù)程序安全,防止核心 API 被隨意篡改,避免用戶自己編寫的類動(dòng)態(tài)替換 Java 的一些核心類,比如我們自定義類:java.lang.String

在 JVM 中表示兩個(gè) class 對(duì)象是否為同一個(gè)類存在兩個(gè)必要條件:

  • 類的完成類名必須一致,包括包名
  • 加載這個(gè)類的 ClassLoader(指ClassLoader實(shí)例對(duì)象)必須相同

沙箱安全機(jī)制

如果我們自定義 String 類,但是在加載自定義 String 類的時(shí)候會(huì)率先使用引導(dǎo)類加載器加載,而引導(dǎo)類加載器在加載的過(guò)程中會(huì)先加載 jdk 自帶的文件(rt.jar包中 java\lang\String.class),報(bào)錯(cuò)信息說(shuō)沒有 main 方法就是因?yàn)榧虞d的是rt.jar包中的String類。這樣就可以保證對(duì) java 核心源代碼的保護(hù),這就是簡(jiǎn)單的沙箱安全機(jī)制。

破壞雙親委派模型

  • 雙親委派模型并不是一個(gè)強(qiáng)制性的約束模型,而是 Java 設(shè)計(jì)者推薦給開發(fā)者的類加載器實(shí)現(xiàn)方式,可以“被破壞”,只要我們自定義類加載器,重寫 loadClass() 方法,指定新的加載邏輯就破壞了,重寫 findClass() 方法不會(huì)破壞雙親委派。
  • 雙親委派模型有一個(gè)問(wèn)題:頂層 ClassLoader,無(wú)法加載底層 ClassLoader 的類。典型例子JNDI、JDBC,所以加入了線程上下文類加載器(Thread Context ClassLoader),可以通過(guò)Thread.setContextClassLoaser()設(shè)置該類加載器,然后頂層 ClassLoader 再使用 Thread.getContextClassLoader() 獲得底層的 ClassLoader 進(jìn)行加載。
  • Tomcat 中使用了自定 ClassLoader,并且也破壞了雙親委托機(jī)制。每個(gè)應(yīng)用使用 WebAppClassloader 進(jìn)行單獨(dú)加載,他首先使用 WebAppClassloader 進(jìn)行類加載,如果加載不了再委托父加載器去加載,這樣可以保證每個(gè)應(yīng)用中的類不沖突。每個(gè)tomcat中可以部署多個(gè)項(xiàng)目,每個(gè)項(xiàng)目中存在很多相同的class文件(很多相同的jar包),他們加載到 jvm 中可以做到互不干擾。
  • 利用破壞雙親委派來(lái)實(shí)現(xiàn)代碼熱替換(每次修改類文件,不需要重啟服務(wù))。因?yàn)橐粋€(gè) Class 只能被一個(gè)ClassLoader 加載一次,否則會(huì)報(bào) java.lang.LinkageError。當(dāng)我們想要實(shí)現(xiàn)代碼熱部署時(shí),可以每次都new 一個(gè)自定義的 ClassLoader 來(lái)加載新的 Class文件。JSP 的實(shí)現(xiàn)動(dòng)態(tài)修改就是使用此特性實(shí)現(xiàn)。

關(guān)鍵詞:

 

關(guān)于我們 - 聯(lián)系我們 - 版權(quán)聲明 - 招聘信息 - 友鏈交換

2014-2020  電腦商網(wǎng) 版權(quán)所有. All Rights Reserved.

備案號(hào):京ICP備2022022245號(hào)-1 未經(jīng)過(guò)本站允許,請(qǐng)勿將本站內(nèi)容傳播或復(fù)制.

聯(lián)系我們:435 226 40@qq.com

日韩亚洲国产高清免费视频_国产精品2020观看久久_久久99精品福利久久久_我要看欧美精品一级毛片

            欧美日韩成人在线| 国产精品久久精品日日| 亚洲乱码国产乱码精品精98午夜 | 国产精品久久久久久久久动漫 | av电影在线不卡| 亚洲男人的天堂一区二区| 欧美另类高清zo欧美| 日韩一区有码在线| 国产乱对白刺激视频不卡| 中文字幕一区二区5566日韩| 欧美精品久久一区二区三区| 亚洲色大成网站www久久九九| 国产一区二区在线免费观看| 18成人在线观看| 日韩欧美一区二区在线视频| 亚洲高清中文字幕| 99re热这里只有精品免费视频| 亚洲成av人综合在线观看| 久久―日本道色综合久久| 日韩av电影一区| 欧美国产综合色视频| 欧美日韩国产高清一区| 樱花影视一区二区| 97久久精品人人澡人人爽| 91久久精品午夜一区二区| 国产精品久久久久久久午夜片 | 中文字幕av一区二区三区高| 欧美高清性hdvideosex| 一区二区高清免费观看影视大全| 成人小视频免费在线观看| 亚洲高清视频的网址| 亚洲国产精品av| 国产精品夜夜爽| 亚洲成av人片一区二区| 中文一区在线播放| 福利一区二区在线| 一本高清dvd不卡在线观看 | 日本一区二区成人| 日韩小视频在线观看专区| 日韩不卡手机在线v区| 中文字幕亚洲综合久久菠萝蜜| 日韩精品一区二区三区在线| 免播放器亚洲一区| 亚洲精品欧美综合四区| 日本一区二区三区四区| 成人免费看的视频| 欧美写真视频网站| 偷拍亚洲欧洲综合| 国产精品盗摄一区二区三区| 精品国产成人系列| 国产很黄免费观看久久| 午夜精品在线视频一区| 亚洲精品一二三| 久久久不卡网国产精品一区| 日韩一区二区三区在线观看| 久久精品国产在热久久| 亚洲线精品一区二区三区| 亚洲欧洲另类国产综合| www久久精品| 日韩一区二区视频| 狠狠色丁香九九婷婷综合五月| 亚洲图片有声小说| 亚洲日本va午夜在线影院| 久久午夜免费电影| 欧美v亚洲v综合ⅴ国产v| 国产主播一区二区| 欧洲av一区二区嗯嗯嗯啊| 亚洲高清不卡在线观看| 日韩毛片高清在线播放| 国产精品久久久久久久久免费丝袜 | 国产欧美日韩在线看| www.久久久久久久久| 91精品中文字幕一区二区三区| 久久国产麻豆精品| 欧洲生活片亚洲生活在线观看| 五月天激情综合| 亚洲一区二区av电影| 一区二区在线观看av| 亚洲图片你懂的| 亚洲三级电影网站| 成人欧美一区二区三区1314| 一区免费观看视频| 国产精品久久久久aaaa| 亚洲欧洲在线观看av| 国产精品久久久久永久免费观看 | 国产欧美一区二区精品性| 国产女人aaa级久久久级| 久久一留热品黄| 久久精品亚洲一区二区三区浴池| av在线一区二区| 久久亚洲影视婷婷| 久久综合九色综合欧美就去吻 | 午夜久久久久久久久| 亚洲在线观看免费| 亚洲成av人综合在线观看| 亚洲国产日产av| 午夜日韩在线观看| 色婷婷久久久久swag精品| 日本成人在线不卡视频| 日本一区二区视频在线观看| 性做久久久久久免费观看欧美| 中文字幕在线观看不卡视频| 亚洲三级电影网站| 自拍偷拍亚洲综合| 亚洲图片一区二区| 亚洲电影一级黄| 免费人成在线不卡| 欧美日韩一级片在线观看| 国产一区二区精品久久91| 9191成人精品久久| 成人av手机在线观看| 久久老女人爱爱| 国产亚洲欧美激情| 亚洲欧美国产77777| 伊人夜夜躁av伊人久久| 亚洲午夜影视影院在线观看| 亚洲一区av在线| 裸体歌舞表演一区二区| 欧美精品自拍偷拍| 成人av在线一区二区三区| 国产色产综合色产在线视频| 国产精品亲子伦对白| 夜色激情一区二区| 91福利国产成人精品照片| 国产精品亚洲午夜一区二区三区| 日韩免费视频线观看| 久久久电影一区二区三区| 日韩美女啊v在线免费观看| 樱花草国产18久久久久| 蜜臀av一区二区在线免费观看| 欧美aaaaaa午夜精品| 亚洲欧洲日韩在线| 亚洲成在人线免费| 精品视频色一区| 成人av午夜电影| 国产精品国产三级国产普通话99| 亚洲免费电影在线| 玖玖九九国产精品| 精品日韩一区二区| 中文字幕亚洲区| 蜜臀av国产精品久久久久| 欧美一区二区三区在线视频| 国产丝袜欧美中文另类| 亚洲在线视频网站| 欧美日韩国产在线观看| 26uuu亚洲综合色欧美| 一区二区三区在线观看国产| 91成人在线精品| 99久久精品免费| 亚洲乱码国产乱码精品精98午夜| 色av成人天堂桃色av| 99在线视频精品| 亚洲另类在线制服丝袜| 欧美日韩在线三区| 国产人伦精品一区二区| 偷偷要91色婷婷| 日韩一区二区在线观看视频| 国产精品女主播av| 美女在线一区二区| 久久久精品免费观看| 亚洲一区二区成人在线观看| 成人综合在线观看| 亚洲视频狠狠干| 欧美日韩国产一级| 中文字幕国产一区二区| 麻豆91免费看| 国产精品无码永久免费888| 色综合久久久久久久| 91在线观看高清| 婷婷激情综合网| 欧美精品一区二区高清在线观看 | 国产精品一区在线观看乱码| 国产精品国产精品国产专区不蜜 | 男人的天堂亚洲一区| 国产亚洲成aⅴ人片在线观看| 亚洲综合丁香婷婷六月香| 丰满岳乱妇一区二区三区| 一区二区三区四区激情| 欧美一区二区三区免费| 亚洲男女毛片无遮挡| 丁香亚洲综合激情啪啪综合| 亚洲激情校园春色| 欧美sm美女调教| 五月综合激情婷婷六月色窝| 91美女精品福利| 看片网站欧美日韩| 中文字幕一区免费在线观看| 欧美精品vⅰdeose4hd| 有坂深雪av一区二区精品| 成人午夜免费视频| 视频在线观看一区| 国产女主播视频一区二区| 欧美日韩一区成人| 亚洲三级久久久| 99精品视频在线播放观看| 日本强好片久久久久久aaa| 国产亚洲1区2区3区| 精品1区2区3区| 亚洲精品写真福利| 91美女视频网站|