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

Groovy深入探索:Groovy的ClassLoader體系

開發(fā) 后端
Groovy中定義了不少ClassLoader,本文將介紹其中絕大多數(shù)Groovy腳本都會(huì)涉及到的,也是最主要的3個(gè)ClassLoader:RootLoader、GroovyClassLoader和GroovyClassLoader.InnerLoader。

Groovy中定義了不少ClassLoader,本文將介紹其中絕大多數(shù)Groovy腳本都會(huì)涉及到的,也是最主要的3個(gè)ClassLoader:RootLoader、GroovyClassLoader和GroovyClassLoader.InnerLoader。

注:以下分析的Groovy源代碼來自Groovy 2.1.3。

Java的ClassLoader

顧名思義,Java的ClassLoader就是類的裝載器,它使JVM可以動(dòng)態(tài)的載入Java類,JVM并不需要知道從什么地方(本地文件、網(wǎng)絡(luò)等)載入Java類,這些都由ClassLoader完成。

可以說,ClassLoader是Class的命名空間。同一個(gè)名字的類可以由多個(gè)ClassLoader載入,由不同ClassLoader載入的相同名字的類將被認(rèn)為是不同的類;而同一個(gè)ClassLoader對(duì)同一個(gè)名字的類只能載入一次。

Java的ClassLoader有一個(gè)著名的雙親委派模型(Parent Delegation Model):除了Bootstrap ClassLoader外,每個(gè)ClassLoader都有一個(gè)parent的ClassLoader,沿著parent最終會(huì)追索到Bootstrap ClassLoader;當(dāng)一個(gè)ClassLoader要載入一個(gè)類時(shí),會(huì)首先委派給parent,如果parent能載入這個(gè)類,則返回,否則這個(gè)ClassLoader才會(huì)嘗試去載入這個(gè)類。

Java的ClassLoader體系如下,其中箭頭指向的是該ClassLoader的parent:

  1. Bootstrap ClassLoader  
  2.          ↑  
  3. Extension ClassLoader  
  4.          ↑  
  5. System ClassLoader  
  6.          ↑  
  7. User Custom ClassLoader  // 不一定有 

更多關(guān)于Java的ClassLoader的信息請參考以下資料: 

 

Groovy的ClassLoader

我們首先通過一個(gè)腳本來看一下,一個(gè)Groovy腳本的ClassLoader以及它的祖先們分別是什么:

  1. def cl = this.class.classLoader  
  2. while (cl) {  
  3.     println cl  
  4.     cl = cl.parent  

輸出如下: 

  1. groovy.lang.GroovyClassLoader$InnerLoader@18622f3  
  2. groovy.lang.GroovyClassLoader@147c1db  
  3. org.codehaus.groovy.tools.RootLoader@186db54  
  4. sun.misc.Launcher$AppClassLoader@192d342  
  5. sun.misc.Launcher$ExtClassLoader@6b97fd 

我們從而得出Groovy的ClassLoader體系:

  1.             null                      // 即Bootstrap ClassLoader  
  2.              ↑  
  3. sun.misc.Launcher.ExtClassLoader      // 即Extension ClassLoader  
  4.              ↑  
  5. sun.misc.Launcher.AppClassLoader      // 即System ClassLoader  
  6.              ↑  
  7. org.codehaus.groovy.tools.RootLoader  // 以下為User Custom ClassLoader  
  8.              ↑  
  9. groovy.lang.GroovyClassLoader  
  10.              ↑  
  11. groovy.lang.GroovyClassLoader.InnerLoader 

下面我們分別介紹一下RootLoader、GroovyClassLoader和GroovyClassLoader.InnerLoader。

Groovy腳本啟動(dòng)過程

要介紹RootLoader前,我們需要介紹一下Groovy腳本的啟動(dòng)過程。

當(dāng)我們在命令行輸入“groovy SomeScript”來運(yùn)行腳本時(shí),調(diào)用的是shell腳本$GROOVY_HOME/bin/groovy:

  1. #…   
  2. startGroovy groovy.ui.GroovyMain "$@" 

其中startGroovy定義在$GROOVY_HOME/bin/startGroovy中: 

  1. #…  
  2. STARTER_CLASSPATH="$GROOVY_HOME/lib/groovy-2.1.3.jar" 
  3. #…  
  4. startGroovy ( ) {  
  5.     CLASS=$1 
  6.     shift  
  7.     # Start the Profiler or the JVM  
  8.     if $useprofiler ; then  
  9.         runProfiler  
  10.     else 
  11.         exec "$JAVACMD" $JAVA_OPTS \  
  12.             -classpath "$STARTER_CLASSPATH" \  
  13.             -Dscript.name="$SCRIPT_PATH" \  
  14.             -Dprogram.name="$PROGNAME" \  
  15.             -Dgroovy.starter.conf="$GROOVY_CONF" \  
  16.             -Dgroovy.home="$GROOVY_HOME" \  
  17.             -Dtools.jar="$TOOLS_JAR" \  
  18.             $STARTER_MAIN_CLASS \  
  19.             --main $CLASS \  
  20.             --conf "$GROOVY_CONF" \  
  21.             --classpath "$CP" \  
  22.             "$@" 
  23.     fi  
  24. }  
  25.  
  26. STARTER_MAIN_CLASS=org.codehaus.groovy.tools.GroovyStarter 

我們可以發(fā)現(xiàn),這里其實(shí)是通過java啟動(dòng)了org.codehaus.groovy.tools.GroovyStarter,然后把“--main groovy.ui.GroovyMain”作為參數(shù)傳給GroovyStarter,***又把SomeScript作為參數(shù)傳給GroovyMain。注意,這里只把$GROOVY_HOME/lib/groovy-2.1.3.jar作為classpath參數(shù)傳給了JVM,而不包含Groovy依賴的第三方j(luò)ar包。

我們來看一下GroovyStarter的源代碼(其中省略了異常處理的代碼):

  1. public static void rootLoader(String args[]) {  
  2.     String conf = System.getProperty("groovy.starter.conf",null);  
  3.     LoaderConfiguration lc = new LoaderConfiguration();  
  4.     // 這里省略了解析命令行參數(shù)的代碼  
  5.     // load configuration file  
  6.     if (conf!=null) {  
  7.         lc.configure(new FileInputStream(conf));  
  8.     }  
  9.     // create loader and execute main class  
  10.     ClassLoader loader = new RootLoader(lc);  
  11.     Class c = loader.loadClass(lc.getMainClass()); // 使用RootLoader載入GroovyMain  
  12.     Method m = c.getMethod("main"new Class[]{String[].class});  
  13.     m.invoke(nullnew Object[]{newArgs}); // 調(diào)用GroovyMain的main方法  
  14. }  
  15. //   
  16. public static void main(String args[]) {  
  17.     rootLoader(args);  

這里的LoaderConfiguration是用來做什么的呢?它是用來解析$GROOVY_HOME/conf/groovy-starter.conf文件的,該文件內(nèi)容如下(去掉了注釋部分):

  1. load !{groovy.home}/lib/*.jar  
  2. load !{user.home}/.groovy/lib/*.jar  
  3. load ${tools.jar} 

這表示,將$GROOVY_HOME/lib/*.jar、$HOME/.groovy/lib/*.jar以及tools.jar加入到RootLoader的classpath中,可以看出,這里包含了Groovy依賴的第三方j(luò)ar包。

接下來,我們來看一下GroovyMain的源代碼。GroovyMain的main函數(shù)進(jìn)去之后,最終會(huì)到達(dá)processOnce方法:

  1. private void processOnce() throws CompilationFailedException, IOException {  
  2.     GroovyShell groovy = new GroovyShell(conf);  
  3.  
  4.     if (isScriptFile) {  
  5.         if (isScriptUrl(script)) {  
  6.             groovy.run(getText(script), script.substring(script.lastIndexOf("/") + 1), args);  
  7.         } else {  
  8.             groovy.run(huntForTheScriptFile(script), args); // 本地腳本文件執(zhí)行這行  
  9.         }  
  10.     } else {  
  11.         groovy.run(script, "script_from_command_line", args);  
  12.     }  

可以看到,GroovyMain是通過GroovyShell來執(zhí)行腳本文件的,GroovyShell的具體執(zhí)行腳本的代碼我們不再分析,我們只看GroovyShell的構(gòu)造函數(shù)中初始化ClassLoader的代碼:

  1. final ClassLoader parentLoader = (parent!=null)?parent:GroovyShell.class.getClassLoader();  
  2. this.loader = AccessController.doPrivileged(new PrivilegedAction<GroovyClassLoader>() {  
  3.     public GroovyClassLoader run() {  
  4.         return new GroovyClassLoader(parentLoader,config);  
  5.     }  
  6. }); 

由此可見,GroovyShell使用了GroovyClassLoader來加載類,而該GroovyClassLoader的parent即為GroovyShell的ClassLoader,也就是GroovyMain的ClassLoader,也就是RootLoader。

***來總結(jié)一下Groovy腳本的啟動(dòng)流程(括號(hào)中表示使用的ClassLoader):

  1. GroovyStarter  
  2.     ↓ (RootLoader)  
  3. GroovyMain  
  4.     ↓  
  5. GroovyShell  
  6.     ↓ (GroovyClassLoader)  
  7. SomeScript 

#p#

RootLoader

RootLoader作為Groovy的根ClassLoader,負(fù)責(zé)加載Groovy及其依賴的第三方庫中的類。它管理了Groovy的classpath,我們可以通過$GROOVY_HOME/conf/groovy-starter.conf文件或groovy的命令行參數(shù)“-classpath”往其中添加路徑。注意,這有別于java的命令行參數(shù)“-classpath”定義的classpath,RootLoader中的classpath對(duì)Java原有的ClassLoader是不可見的。

我們先通過一個(gè)腳本來看一下RootLoader是如何體現(xiàn)為Groovy的classpath管理者的:

  1. class C {}  
  2.  
  3. println this.class.classLoader  
  4. println C.classLoader  
  5. println()  
  6.  
  7. println groovy.ui.GroovyMain.classLoader  
  8. println org.objectweb.asm.ClassVisitor.classLoader  
  9. println()  
  10.  
  11. println String.classLoader  
  12. println()  
  13.  
  14. println org.codehaus.groovy.tools.GroovyStarter.classLoader  
  15. println ClassLoader.systemClassLoader.findLoadedClass('org.codehaus.groovy.tools.GroovyStarter')?.classLoader  
  16. println() 

輸出如下: 

  1. groovy.lang.GroovyClassLoader$InnerLoader@1ba6076 
  2. groovy.lang.GroovyClassLoader$InnerLoader@1ba6076 
  3.  
  4. org.codehaus.groovy.tools.RootLoader@a97b0b 
  5. org.codehaus.groovy.tools.RootLoader@a97b0b 
  6.  
  7. null 
  8.  
  9. org.codehaus.groovy.tools.RootLoader@a97b0b 
  10. sun.misc.Launcher$AppClassLoader@192d342 
  • 腳本類和C類的ClassLoader是GroovyClassLoader.InnerLoader,這是我們預(yù)期內(nèi)的。
  • GroovyMain 的ClassLoader是RootLoader,是因?yàn)镚roovyStarter就是用RootLoader來加載它的;而ClassVisitor 是Groovy依賴的asm庫中的類,這個(gè)庫的jar文件路徑不在Java的classpath中,而是在Groovy的classpath中,所以很自然的,它的ClassLoader也是RootLoader。
  • String的ClassLoader是null,這是因?yàn)镴DK中的基本類型都必須由Bootstrap ClassLoader加載(如果允許自定義的ClassLoader加載,那就天下大亂了)。
  • GroovyStarter 的ClassLoader是RootLoader,這點(diǎn)讓我們很意外,GroovyStarter應(yīng)該已經(jīng)由System ClassLoader載入(systemClassLoader.findLoadedClass證實(shí)了這個(gè)想法),根據(jù)雙親委派模型,System ClassLoader的后代都不會(huì)嘗試去加載這個(gè)類,為什么RootLoader又去加載了一次GroovyStarter呢?

答案很簡單,因?yàn)镽ootLoader沒有遵循雙親委派模型。我們來看一下RootLoader的loadClass方法(做了一些簡單的方法展開): 

  1. protected synchronized Class loadClass(final String name, boolean resolve) throws ClassNotFoundException {  
  2.     Class c = this.findLoadedClass(name);  
  3.     if (c != nullreturn c;  
  4.     c = (Class) customClasses.get(name); // customClasses定義了一些必須由Java原有ClassLoader載入的類  
  5.     if (c != nullreturn c;  
  6.  
  7.    try {  
  8.         c = super.findClass(name); // 先嘗試加載這個(gè)類  
  9.     } catch (ClassNotFoundException cnfe) {  
  10.         // IGNORE  
  11.     }  
  12.     if (c == null) c = super.loadClass(name, resolve); // 加載不到則回到原有的雙親委派模型  
  13.  
  14.     if (resolve) resolveClass(c);  
  15.  
  16.     return c;  

RootLoader先嘗試加載類,如果加載不到,再委派給parent加載,所以即使parent已經(jīng)載入了GroovyStarter,RootLoader還會(huì)再加載一次。

為什么要這樣做的?道理很簡單。在前文中,我一再提醒大家,Java的classpath中只包含了Groovy的jar包,而不包含Groovy依賴的第三方j(luò)ar包,而Groovy的classpath則包含了Groovy以及其依賴的所有第三方j(luò)ar包。如果RootLoader使用雙親委派模型,那么Groovy的jar包中的類就會(huì)由System ClassLoader加載,當(dāng)解析Groovy的類時(shí),需要加載第三方的jar包,這時(shí)System ClassLoader并不知道從哪里加載,導(dǎo)致找不到類。因此RootLoader并沒有使用雙親委派模型。

可能你有疑問:為什么不把這些jar包都加入Java的classpath中?這樣不就不會(huì)有這個(gè)問題了嗎?確實(shí)如此,但是Groovy可以通過多種方式更靈活的往自己的classpath中添加路徑(你甚至可以通過代碼往RootLoader的classpath中添加路徑),而Java的classpath只能通過命令行添加,因此就有了RootLoader這樣的設(shè)計(jì)。

GroovyClassLoader

GroovyClassLoader主要負(fù)責(zé)在運(yùn)行時(shí)編譯groovy源代碼為Class的工作,從而使Groovy實(shí)現(xiàn)了將groovy源代碼動(dòng)態(tài)加載為Class的功能。

GroovyClassLoader編譯groovy代碼的工作重要集中到doParseClass方法中:

  1. private Class doParseClass(GroovyCodeSource codeSource) {  
  2.     validate(codeSource); // 簡單校驗(yàn)一些參數(shù)是否為null  
  3.     Class answer;  // Was neither already loaded nor compiling, so compile and add to cache.  
  4.     CompilationUnit unit = createCompilationUnit(config, codeSource.getCodeSource());  
  5.     SourceUnit su = null;  
  6.     if (codeSource.getFile() == null) {  
  7.         su = unit.addSource(codeSource.getName(), codeSource.getScriptText());  
  8.     } else {  
  9.         su = unit.addSource(codeSource.getFile());  
  10.     }  
  11.  
  12.     ClassCollector collector = createCollector(unit, su); // 這里創(chuàng)建了InnerLoader  
  13.     unit.setClassgenCallback(collector);  
  14.     int goalPhase = Phases.CLASS_GENERATION;  
  15.     if (config != null && config.getTargetDirectory() != null) goalPhase = Phases.OUTPUT;  
  16.     unit.compile(goalPhase); // 編譯groovy源代碼  
  17.  
  18.     // 查找源文件中的Main Class  
  19.     answer = collector.generatedClass;  
  20.     String mainClass = su.getAST().getMainClassName();  
  21.     for (Object o : collector.getLoadedClasses()) {  
  22.         Class clazz = (Class) o;  
  23.         String clazzName = clazz.getName();  
  24.         definePackage(clazzName);  
  25.         setClassCacheEntry(clazz);  
  26.         if (clazzName.equals(mainClass)) answer = clazz;  
  27.     }  
  28.     return answer;  

如何編譯groovy源代碼已超出本文的范疇,因此不再介紹具體過程。

GroovyClassLoader.InnerLoader

我們繼續(xù)來看一下GroovyClassLoader的createCollector方法:

  1. protected ClassCollector createCollector(CompilationUnit unit, SourceUnit su) {  
  2.     InnerLoader loader = AccessController.doPrivileged(new PrivilegedAction<InnerLoader>() {  
  3.         public InnerLoader run() {  
  4.             return new InnerLoader(GroovyClassLoader.this);  
  5.         }  
  6.     });  
  7.     return new ClassCollector(loader, unit, su);  
  8. }  
  9.  
  10. public static class ClassCollector extends CompilationUnit.ClassgenCallback {  
  11.     private final GroovyClassLoader cl;  
  12.     // ……  
  13.     protected ClassCollector(InnerLoader cl, CompilationUnit unit, SourceUnit su) {  
  14.         this.cl = cl;  
  15.         // ……  
  16.     }  
  17.     public GroovyClassLoader getDefiningClassLoader() {  
  18.         return cl;  
  19.     }  
  20.     protected Class createClass(byte[] code, ClassNode classNode) {  
  21.         GroovyClassLoader cl = getDefiningClassLoader();  
  22.         Class theClass = cl.defineClass(classNode.getName(), code, 0, code.length, unit.getAST().getCodeSource()); // 通過InnerLoader加載該類  
  23.         this.loadedClasses.add(theClass);  
  24.         // ……  
  25.         return theClass;  
  26.     }  
  27.     // ……  

我們可以看出,ClassCollector的作用,就是在編譯的過程中,將編譯出來的字節(jié)碼,通過InnerLoader進(jìn)行加載。另外,每次編譯groovy源代碼的時(shí)候,都會(huì)新建一個(gè)InnerLoader的實(shí)例。 

InnerLoader是如何加載這些類的呢?它將所有的加載工作又委派回給GroovyClassLoader。由于InnerLoader的代碼簡單,這里就不貼出來了。 

那有了GroovyClassLoader,為什么還需要InnerLoader呢?主要有兩個(gè)原因: 

  •  由于一個(gè)ClassLoader對(duì)于同一個(gè)名字的類只能加載一次,如果都由GroovyClassLoader加載,那么當(dāng)一個(gè)腳本里定義了C這個(gè)類之后,另外一個(gè)腳本再定義一個(gè)C類的話,GroovyClassLoader就無法加載了。
  • 由于當(dāng)一個(gè)類的ClassLoader被GC之后,這個(gè)類才能被GC,如果由GroovyClassLoader加載所有的類,那么只有當(dāng)GroovyClassLoader被GC了,所有這些類才能被GC,而如果用InnerLoader的話,由于編譯完源代碼之后,已經(jīng)沒有對(duì)它的外部引用,除了它加載的類,所以只要它加載的類沒有被引用之后,它以及它加載的類就都可以被GC了。

總結(jié)

本文介紹了Groovy中最主要的3個(gè)ClassLoader:

  • RootLoader:管理了Groovy的classpath,負(fù)責(zé)加載Groovy及其依賴的第三方庫中的類,它不是使用雙親委派模型。
  • GroovyClassLoader:負(fù)責(zé)在運(yùn)行時(shí)編譯groovy源代碼為Class的工作,從而使Groovy實(shí)現(xiàn)了將groovy源代碼動(dòng)態(tài)加載為Class的功能。
  • GroovyClassLoader.InnerLoader:Groovy腳本類的直接ClassLoader,它將加載工作委派給GroovyClassLoader,它的存在是為了支持不同源碼里使用相同的類名,以及加載的類能順利被GC。 

原文鏈接:http://www.blogjava.net/johnnyjian/archive/2013/04/14/397823.html

責(zé)任編輯:林師授
相關(guān)推薦

2010-08-25 10:42:20

GroovyGroovy++

2009-08-03 10:44:51

Groovy 1.7Groovy

2009-08-11 10:32:23

什么是Groovy

2009-06-19 18:11:35

GroovySpring

2022-11-09 10:33:39

awk腳本Groovy

2012-02-13 10:41:57

JavaGroovy

2023-01-06 08:06:52

Groovy類型擴(kuò)展

2012-07-02 10:40:24

GroovyJavaJVM

2009-09-03 11:47:43

Groovy與Java

2012-11-19 11:09:15

IBMdw

2009-04-14 11:01:33

GoogleApp EngineGroovy

2022-12-28 08:03:02

Groovy語法GPath

2021-07-13 05:47:40

GroovyJSON軟件開發(fā)

2023-01-10 08:04:31

2010-02-01 09:21:49

GroovyGoogle App Gaelyk

2023-01-04 08:39:34

2009-06-12 18:30:12

Groovy 靜態(tài)ma

2022-09-06 09:37:17

GroovyJava框架

2009-06-12 10:58:30

GroovyJavaFXJava平臺(tái)

2012-02-16 11:06:00

ibmdw
點(diǎn)贊
收藏

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

你懂的在线观看网站| 蜜桃成人在线| 久久久久久av无码免费网站| 麻豆成人入口| 欧美亚洲一区三区| 第九区2中文字幕| 青青视频在线观| 久久激情五月激情| 久久久人成影片一区二区三区观看 | 国产a√精品区二区三区四区| 在线最新版中文在线| 自拍偷拍国产精品| 免费影院在线观看一区| 国产一区二区三区四区视频| 欧美/亚洲一区| 亚洲深夜福利在线| 妖精视频在线观看| 少妇精品视频一区二区免费看| 亚洲精品日韩一| 秋霞久久久久久一区二区| 亚洲成人av综合| 日本不卡一区二区| 国内精品美女av在线播放| 国产免费嫩草影院| 中国av一区| 欧美精品一区二区三区在线播放| 午夜免费福利视频在线观看| 乡村艳史在线观看| 亚洲一区二区影院| aaa免费在线观看| 免费福利在线视频| 99riav一区二区三区| www.久久久| av综合在线观看| 日韩av一二三| 欧美最近摘花xxxx摘花| 黄色激情视频在线观看| 欧美黄色一区| 久热精品视频在线| 国产又粗又黄又猛| 少妇精品久久久| 亚洲乱亚洲乱妇无码| 中国xxxx性xxxx产国| 一区二区免费| 日韩一卡二卡三卡四卡| 亚洲18在线看污www麻豆| 日韩毛片在线| 在线视频一区二区免费| 国产乱子夫妻xx黑人xyx真爽| 538在线观看| 亚洲国产美国国产综合一区二区| 女人被男人躁得好爽免费视频| 国产精品一区二区三区视频网站| 国产精品电影院| 手机在线观看国产精品| av色图一区| 国产精品人妖ts系列视频| 日韩欧美精品在线不卡| 国产资源在线观看| 欧美国产一区二区在线观看| 亚洲看片网站| 欧美精品hd| 亚洲视频一区二区在线观看| 亚洲黄色网址在线观看| 97caopor国产在线视频| 亚洲午夜电影网| 鲁一鲁一鲁一鲁一色| 日本乱码一区二区三区不卡| 色狠狠桃花综合| 亚洲精品一二三四五区| 日韩毛片网站| 日韩欧美精品在线视频| 日韩少妇一区二区| 国产欧美日韩视频在线| www.国产一区| 免费在线观看日韩| 久久国产精品毛片| 91精品国产自产在线| 99国产精品久久久久久久成人| 福利91精品一区二区三区| 国产在线一区二区三区播放| 免费黄色在线视频网站| 1024成人网| 男女视频网站在线观看| 写真福利精品福利在线观看| 欧美日韩视频在线观看一区二区三区| caoporm在线视频| 国产精品自在| 在线观看成人黄色| 免费视频网站www| 久久影院亚洲| 99国产超薄肉色丝袜交足的后果| 天堂在线观看免费视频| 国产精品区一区二区三区| 精品国产一区二区三区无码| 日韩免费va| 日韩一区二区三区免费看 | 成人看片黄a免费看视频| 精品视频一区在线视频| 久久国产波多野结衣| 韩国一区二区三区四区| av网站免费在线观看| 亚洲精品国产第一综合99久久| 国产a级片网站| 成人国产精品入口免费视频| 日韩欧美一级在线播放| 一区二区三区四区免费| 午夜精品婷婷| 国产精品大片wwwwww| 亚洲精品国产手机| 国产精品区一区二区三区| 久久99中文字幕| 豆花视频一区| 中文字幕欧美日韩| 久久一区二区三区视频| 国产成人av电影在线| 亚洲精品成人久久久998| 成人免费观看在线观看| 3atv一区二区三区| 影音先锋制服丝袜| 亚洲在线日韩| 国产精品对白刺激久久久| 一级日本在线| 色av综合在线| 超碰97人人干| 亚洲精品乱码| yy111111少妇影院日韩夜片 | www一区二区| 久久亚洲国产成人精品无码区| 久久人人视频| 精品久久久中文| 亚洲天堂av网站| 狠狠色丁香久久综合频道| 亚洲最大的免费| 暖暖日本在线观看| 欧美色爱综合网| 精品中文字幕乱| 91福利区一区二区三区| ts人妖另类在线| 黄页视频在线播放| 欧美揉bbbbb揉bbbbb| 国产交换配乱淫视频免费| 伊人天天综合| 国产精品久久精品国产| www亚洲视频| 特级西西人体wwwww| 亚洲三区在线观看无套内射| 亚洲日本va午夜在线影院| 久久久精品麻豆| 国产乱淫片视频| 蜜臀久久99精品久久久久久9| 精品在线观看一区二区| 欧美性video| 精品国内二区三区| 不卡的免费av| 99视频精品全部免费在线| 91成人在线观看喷潮教学| 久久久久久毛片免费看| 69久久夜色精品国产69乱青草| 网站黄在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 污片免费在线观看| 99香蕉国产精品偷在线观看| 久久人人97超碰人人澡爱香蕉| 伊人久久精品一区二区三区| 亚洲欧美日韩国产中文| 中文字幕免费高清在线观看| 中文字幕在线不卡| 午夜诱惑痒痒网| 亚洲国产激情| 欧美日韩三区四区| 国产欧美自拍| 色综合五月天导航| 日本精品专区| 欧美日韩国产首页| 麻豆91精品91久久久| av电影天堂一区二区在线观看| 苍井空浴缸大战猛男120分钟| 成人黄色小视频| 91久久久久久久久久久| 国产传媒在线| 在线精品播放av| 亚洲成人黄色片| 91久久免费观看| 欧美高清视频一区二区三区| 99精品偷自拍| 亚洲一区二区三区四区五区| 亚洲毛片播放| 视频一区视频二区视频| 亚洲成人偷拍| 国产精品视频在线播放| 欧美高清另类hdvideosexjaⅴ| 亚洲国产成人精品久久| 中文字幕777| 精品福利樱桃av导航| 日韩福利在线视频| 波多野结衣在线一区| 国产区二区三区| 亚洲黄色三级| 先锋影音男人资源| 伊人久久综合影院| 99热在线播放| 97欧美成人| 国语自产精品视频在线看| 日本在线观看www| 国产丝袜一区视频在线观看| 国产人妻精品一区二区三区| 色婷婷精品大在线视频| 久久久久久久久99| 自拍av一区二区三区| 国产精品无码久久久久一区二区| 国产精品1024| 依人在线免费视频| 久久成人免费| 1024av视频| 欧美日韩综合| www.午夜色| 欧洲杯什么时候开赛| 久久久婷婷一区二区三区不卡| 久久69av| 国产免费一区二区三区香蕉精| 美女91在线看| 欧美激情手机在线视频 | 国产男女无遮挡猛进猛出| 日本中文字幕不卡| 99久久激情视频| 香蕉成人久久| 五十路熟女丰满大屁股| 欧美三级乱码| 特大黑人娇小亚洲女mp4| 日韩在线中文| 亚洲高清123| 成人黄色av| 神马影院我不卡| 欧美日韩激情在线一区二区三区| 欧美久久久久久一卡四| 婷婷五月色综合香五月| 精品乱码一区| 五月综合久久| 久久国产主播精品| 日本韩国欧美超级黄在线观看| 国产日韩欧美亚洲一区| 一区二区三区高清在线观看| 成人在线免费网站| 99ri日韩精品视频| 国产精品视频免费一区二区三区| 97视频一区| 国产一区在线免费| 欧美美女黄色| 日本一区视频在线观看| 欧美日韩在线二区| 五月天久久狠狠| 久久在线播放| 免费看污污视频| 欧美激情视频一区二区三区免费| 日本天堂免费a| 亚洲性感美女99在线| www在线观看免费| 久久www成人_看片免费不卡| av五月天在线| 麻豆精品一区二区| 中文字幕12页| 成人免费精品视频| 51调教丨国产调教视频| 国产亚洲精品超碰| 久久精品在线观看视频| 亚洲欧洲综合另类在线| 国产精品50页| 欧美性猛交xxxx乱大交| 欧美成人一区二区视频| 91精品麻豆日日躁夜夜躁| 高清国产mv在线观看| 日韩电影中文 亚洲精品乱码| 精品影院一区| 久久久精品中文字幕| av电影在线免费| 国产精品激情自拍| 亚洲图色一区二区三区| 欧美人xxxxx| 小小影院久久| 欧美a v在线播放| 毛片av一区二区| 香蕉在线观看视频| 久久这里只有精品首页| 成人三级视频在线观看| 亚洲国产精品一区二区久久恐怖片| 特级毛片www| 91精品国产综合久久精品| 婷婷色在线视频| 色婷婷综合久久久久| 黄色污污视频在线观看| 国产精欧美一区二区三区| 精品一级视频| 欧美主播一区二区三区美女 久久精品人 | 国产在线看一区| 国产精品无码一区二区三| 国产精品美女久久久久aⅴ| 久久精品美女视频| 欧美日韩在线观看一区二区| 丰满人妻一区二区三区四区53| 国产一区二区美女视频| sqte在线播放| 亚洲伊人成综合成人网| 欧美精品系列| 日本韩国欧美在线观看| 国产精品一区在线观看乱码 | 国产成人亚洲精品| 一区二区三区四区精品视频| 日本高清不卡一区二区三| 好吊日精品视频| 亚洲一区日韩精品| 91色婷婷久久久久合中文| 欧美成人免费看| 欧洲国产伦久久久久久久| 欧美一级视频免费| 欧美超级乱淫片喷水| 2019年精品视频自拍| 久草精品电影| 亚洲性感美女99在线| 亚洲欧美日本一区二区| 中文字幕免费观看一区| 欧美日韩一区在线| 中文av免费观看| 日韩国产精品一区| 欧美1234区| 亚洲一区亚洲二区亚洲三区| 天天精品视频| 日本激情综合网| 2020日本不卡一区二区视频| 日韩欧美亚洲国产| 日韩一级片网站| 久久精品视频免费看| 国产精品欧美一区二区| 国产精品欧美在线观看| 日韩少妇内射免费播放| 成人免费毛片app| 久久久久亚洲av无码专区| 91精品国产综合久久福利| 欧美成人二区| 国产欧美日韩丝袜精品一区| 日本欧美国产| 久久综合久久色| 国产三级欧美三级日产三级99| 日韩欧美成人一区二区三区 | 国产精品视频一区二区三区四| 伊人久久成人网| 久久婷婷一区| 成人av毛片在线观看| 国产精品欧美一级免费| 特级做a爱片免费69| 亚洲美女又黄又爽在线观看| 五月天国产在线| 欧美精品七区| 天堂va蜜桃一区二区三区| 国产手机在线观看| 在线观看一区不卡| 3d成人动漫在线| 成人欧美一区二区三区黑人孕妇 | 久久99成人| 日本福利视频网站| 北岛玲一区二区三区四区| 午夜精品久久久久久久久久久久久蜜桃 | 久久全国免费视频| 欧美亚洲大陆| 日本激情视频在线| 最新高清无码专区| 秋霞视频一区二区| 日本久久久久久久久| 成人在线视频免费观看| 国产精品探花在线播放| 一区二区三区四区国产精品| 色一情一乱一区二区三区| 国产成人久久久| 国产精品成人一区二区不卡| 特黄特色免费视频| 色综合久久99| 国产一二三区在线观看| 国产精品yjizz| 日本午夜精品视频在线观看| 久久国产精品国语对白| 精品国产乱码久久久久久闺蜜| 色戒汤唯在线观看| 亚洲日本欧美在线| 成人免费看的视频| 亚洲av无码乱码国产精品fc2| 久久五月天色综合| 美国一区二区| 亚洲va在线va天堂va偷拍| 亚洲成a人v欧美综合天堂下载 | 另类在线视频| 色综合色综合色综合色综合| 亚洲综合在线五月| 福利在线播放| 古典武侠综合av第一页| 日本vs亚洲vs韩国一区三区 | 麻豆tv在线| 久久久综合亚洲91久久98| 激情五月播播久久久精品| www.伊人久久| 欧美激情精品久久久久久|