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

Android注解快速入門和實用解析

移動開發 Android
作為Android開發中熟知的注解,Override只是注解的一種體現,更多時候,注解還有以下作用:降低項目的耦合度;自動完成一些規律性的代碼;自動生成java代碼,減輕開發者的工作量。

首先什么是注解?@Override就是注解,它的作用是:

  • 檢查是否正確的重寫了父類中的方法。
  • 標明代碼,這是一個重寫的方法。

1、體現在于:檢查子類重寫的方法名與參數類型是否正確;檢查方法private/final/static等不能被重寫。實際上@Override對于應用程序并沒有實際影響,從它的源碼中可以出來。

Android注解快速入門和實用解析

2、主要是表現出代碼的可讀性。

Android注解快速入門和實用解析

作為Android開發中熟知的注解,Override只是注解的一種體現,更多時候,注解還有以下作用:

  • 降低項目的耦合度。
  • 自動完成一些規律性的代碼。
  • 自動生成java代碼,減輕開發者的工作量。

一、注解基礎快讀

1、元注解

元注解是由java提供的基礎注解,負責注解其它注解,如上圖Override被@Target和@Retention修飾,它們用來說明解釋其它注解,位于sdk/sources/android-25/java/lang/annotation路徑下。

元注解有:

  • @Retention:注解保留的生命周期
  • @Target:注解對象的作用范圍。
  • @Inherited:@Inherited標明所修飾的注解,在所作用的類上,是否可以被繼承。
  • @Documented:如其名,javadoc的工具文檔化,一般不關心。

@Retention

Retention說標明了注解被生命周期,對應RetentionPolicy的枚舉,表示注解在何時生效:

  • SOURCE:只在源碼中有效,編譯時拋棄,如上面的@Override。
  • CLASS:編譯class文件時生效。
  • RUNTIME:運行時才生效。

如下圖X1,com.android.support:support-annotations中的Nullable注解,會在編譯期判斷,被注解的參數是否會空,具體后續分析。

Android注解快速入門和實用解析

@Target

Target標明了注解的適用范圍,對應ElementType枚舉,明確了注解的有效范圍。

  • TYPE:類、接口、枚舉、注解類型。
  • FIELD:類成員(構造方法、方法、成員變量)。
  • METHOD:方法。
  • PARAMETER:參數。
  • CONSTRUCTOR:構造器。
  • LOCAL_VARIABLE:局部變量。
  • ANNOTATION_TYPE:注解。
  • PACKAGE:包聲明。
  • TYPE_PARAMETER:類型參數。
  • TYPE_USE:類型使用聲明。

如上圖X1所示,@Nullable可用于注解方法,參數,類成員,注解,包聲明中,常用例子如下所示:

 

  1. /** 
  2.   * Nullable表明 
  3.   * bind方法的參數target和返回值Data可以為null 
  4.   */ 
  5.  @Nullable  
  6.  public static Data bind(@Nullable Context target) { 
  7.    //do someThing and return 
  8.    return bindXXX(target); 
  9.  } 

@Inherited

注解所作用的類,在繼承時默認無法繼承父類的注解。除非注解聲明了 @Inherited。同時Inherited聲明出來的注,只對類有效,對方法/屬性無效。

如下方代碼,注解類@AInherited聲明了Inherited ,而注解BNotInherited 沒有,所在在它們的修飾下:

  • 類Child繼承了父類Parent的@AInherited,不繼承@BNotInherited;
  • 重寫的方法testOverride()不繼承Parent的任何注解;
  • testNotOverride()因為沒有被重寫,所以注解依然生效。

 

  1. @Retention(RetentionPolicy.RUNTIME)   
  2. @Inherited   
  3. public @interface AInherited {   
  4.     String value();   
  5. }   
  6. @Retention(RetentionPolicy.RUNTIME)   
  7. public @interface BNotInherited {   
  8.     String value();   
  9. }   
  10.  
  11. @AInherited("Inherited")   
  12. @BNotInherited("沒Inherited")   
  13. public class Parent {   
  14.  
  15.     @AInherited("Inherited")   
  16.     @BNotInherited("沒Inherited")   
  17.     public void testOverride(){   
  18.  
  19.     }   
  20.     @AInherited("Inherited")   
  21.     @BNotInherited("沒Inherited")   
  22.     public void testNotOverride(){ 
  23.     } 
  24. }   
  25.  
  26. /** 
  27.   * Child繼承了Parent的AInherited注解 
  28.   * BNotInherited因為沒有@Inherited聲明,不能被繼承 
  29.   */ 
  30. public class Child extends Parent {   
  31.  
  32.   /** 
  33.    * 重寫的testOverride不繼承任何注解 
  34.    * 因為Inherited不作用在方法上 
  35.    */ 
  36.     @Override   
  37.     public void testOverride() {   
  38.     }   
  39.  
  40.   /** 
  41.    * testNotOverride沒有被重寫 
  42.    * 所以注解AInherited和BNotInherited依然生效。 
  43.    */ 

2、自定義注解

2.1 運行時注解

了解了元注解后,看看如何實現和使用自定義注解。這里我們簡單介紹下運行時注解RUNTIME,編譯時注解CLASS留著后面分析。

首先,創建一個注解遵循: public @interface 注解名 {方法參數},如下方@getViewTo注解:

 

  1. @Target({ElementType.FIELD}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. public @interface getViewTo { 
  4.     int value() default  -1; 

 

然后如下方所示,我們將注解描述在Activity的成員變量mTv和mBtn中,在App運行時,通過反射將findViewbyId得到的控件,注入到mTv和mBtn中。

是不是很熟悉,有點ButterKnife的味道?當然,ButterKnife比這個高級多,畢竟反射多了影響效率,不過我們明白了,可以通過注解來注入和創建對象,這樣可以在一定程度節省代碼量。

 

  1. public class MainActivity extends AppCompatActivity { 
  2.  
  3.     @getViewTo(R.id.textview) 
  4.     private TextView mTv; 
  5.  
  6.     @getViewTo(R.id.button) 
  7.     private Button mBtn; 
  8.  
  9.     @Override 
  10.     protected void onCreate(Bundle savedInstanceState) { 
  11.         super.onCreate(savedInstanceState); 
  12.         setContentView(R.layout.activity_main); 
  13.  
  14.         //通過注解生成View; 
  15.         getAllAnnotationView(); 
  16.     } 
  17.  
  18.     /** 
  19.      * 解析注解,獲取控件 
  20.      */ 
  21.     private void getAllAnnotationView() { 
  22.         //獲得成員變量 
  23.         Field[] fields = this.getClass().getDeclaredFields(); 
  24.  
  25.         for (Field field : fields) { 
  26.           try { 
  27.             //判斷注解 
  28.             if (field.getAnnotations() != null) { 
  29.               //確定注解類型 
  30.               if (field.isAnnotationPresent(GetViewTo.class)) { 
  31.                 //允許修改反射屬性 
  32.                 field.setAccessible(true); 
  33.                 GetViewTo getViewTo = field.getAnnotation(GetViewTo.class); 
  34.                 //findViewById將注解的id,找到View注入成員變量中 
  35.                 field.set(this, findViewById(getViewTo.value())); 
  36.               } 
  37.             } 
  38.           } catch (Exception e) { 
  39.           } 
  40.         } 
  41.       } 
  42.  

2.2 編譯時注解

運行時注解RUNTIME如上2.1所示,大多數時候實在運行時使用反射來實現所需效果,這很大程度上影響效率,如果BufferKnife的每個View注入不可能如何實現。實際上,ButterKnife使用的是編譯時注解CLASS,如下圖X2.2,是ButterKnife的@BindView注解,它是一個編譯時注解,在編譯時生成對應java代碼,實現注入。

Android注解快速入門和實用解析

說到編譯時注解,就不得不說注解處理器 AbstractProcessor,如果你有注意,一般第三方注解相關的類庫,如bufferKnike、ARouter,都有一個Compiler命名的Module,如下圖X2.3,這里面一般都是注解處理器,用于編譯時處理對應的注解。

注解處理器(Annotation Processor)是javac的一個工具,它用來在編譯時掃描和處理注解(Annotation)。你可以對自定義注解,并注冊相應的注解處理器,用于處理你的注解邏輯。

Android注解快速入門和實用解析

如下所示,實現一個自定義注解處理器,至少重寫四個方法,并且注冊你的自定義Processor,詳細可參考下方代碼CustomProcessor。

  • @AutoService(Processor.class),谷歌提供的自動注冊注解,為你生成注冊Processor所需要的格式文件(com.google.auto相關包)。
  • init(ProcessingEnvironment env),初始化處理器,一般在這里獲取我們需要的工具類。
  • getSupportedAnnotationTypes(),指定注解處理器是注冊給哪個注解的,返回指定支持的注解類集合。
  • getSupportedSourceVersion() ,指定java版本。
  • process(),處理器實際處理邏輯入口。

 

  1. @AutoService(Processor.class) 
  2. public class CustomProcessor extends AbstractProcessor { 
  3.  
  4.     /** 
  5.      * 注解處理器的初始化 
  6.      * 一般在這里獲取我們需要的工具類 
  7.      * @param processingEnvironment 提供工具類Elements, Types和Filer 
  8.      */ 
  9.     @Override 
  10.     public synchronized void init(ProcessingEnvironment env){  
  11.         super.init(env); 
  12.         //Element代表程序的元素,例如包、類、方法。 
  13.         mElementUtils = env.getElementUtils(); 
  14.  
  15.         //處理TypeMirror的工具類,用于取類信息 
  16.         mTypeUtils = env.getTypeUtils(); 
  17.  
  18.          //Filer可以創建文件 
  19.         mFiler = env.getFiler(); 
  20.  
  21.         //錯誤處理工具 
  22.         mMessages = env.getMessager(); 
  23.     } 
  24.  
  25.     /** 
  26.      * 處理器實際處理邏輯入口 
  27.      * @param set 
  28.      * @param roundEnvironment 所有注解的集合 
  29.      * @return  
  30.      */ 
  31.     @Override 
  32.     public boolean process(Set<? extends TypeElement> annoations,  
  33.       RoundEnvironment env) { 
  34.         //do someThing 
  35.     } 
  36.  
  37.     //指定注解處理器是注冊給哪個注解的,返回指定支持的注解類集合。 
  38.     @Override 
  39.     public Set<String> getSupportedAnnotationTypes() {  
  40.           Set<String> sets = new LinkedHashSet<String>(); 
  41.  
  42.           //大部分class而已getName、getCanonicalNam這兩個方法沒有什么不同的。 
  43.           //但是對于array或內部類等就不一樣了。 
  44.           //getName返回的是[[Ljava.lang.String之類的表現形式, 
  45.           //getCanonicalName返回的就是跟我們聲明類似的形式。 
  46.           sets(BindView.class.getCanonicalName()); 
  47.  
  48.           return sets; 
  49.     } 
  50.  
  51.     //指定Java版本,一般返回***版本即可 
  52.     @Override 
  53.     public SourceVersion getSupportedSourceVersion() { 
  54.         return SourceVersion.latestSupported(); 
  55.     } 
  56.  

首先,我們梳理下一般處理器處理邏輯:

  1. 遍歷得到源碼中,需要解析的元素列表。
  2. 判斷元素是否可見和符合要求。
  3. 組織數據結構得到輸出類參數。
  4. 輸入生成java文件。
  5. 錯誤處理。

然后,讓我們理解一個概念:Element,因為它是我們獲取注解的基礎。

Processor處理過程中,會掃描全部Java源碼,代碼的每一個部分都是一個特定類型的Element,它們像是XML一層的層級機構,比如類、變量、方法等,每個Element代表一個靜態的、語言級別的構件,如下方代碼所示。

 

  1. package android.demo; // PackageElement  
  2. // TypeElement 
  3. public class DemoClass {  
  4.     // VariableElement 
  5.     private boolean mVariableType;  
  6.     // VariableElement 
  7.     private VariableClassE m VariableClassE;  
  8.     // ExecuteableElement 
  9.     public DemoClass () { 
  10.     }  
  11.     // ExecuteableElement 
  12.     public void resolveData (Demo data   //TypeElement ) { 
  13.     } 

其中,Element代表的是源代碼,而TypeElement代表的是源代碼中的類型元素,例如類。然而,TypeElement并不包含類本身的信息。你可以從TypeElement中獲取類的名字,但是你獲取不到類的信息,例如它的父類。這種信息需要通過TypeMirror獲取。你可以通過調用elements.asType()獲取元素的TypeMirror。

1、知道了Element,我們就可以通過process 中的RoundEnvironment去獲取,掃描到的所有元素,如下圖X2.4,通過env.getElementsAnnotatedWith,我們可以獲取被@BindView注解的元素的列表,其中validateElement校驗元素是否可用。

Android注解快速入門和實用解析

2、因為env.getElementsAnnotatedWith返回的,是所有被注解了@ BindView的元素的列表。所以有時候我們還需要走一些額外的判斷,比如,檢查這些Element是否是一個類:

 

  1. @Override 
  2.   public boolean process(Set<? extends TypeElement> an, RoundEnvironment env) { 
  3.     for (Element e : env.getElementsAnnotatedWith(BindView.class)) { 
  4.       // 檢查元素是否是一個類 
  5.       if (ae.getKind() != ElementKind.CLASS) { 
  6.             ... 
  7.       } 
  8.    } 
  9.    ... 

3、javapoet (com.squareup:javapoet)是一個根據指定參數,生成java文件的開源庫,有興趣了解javapoet的可以看下javapoet——讓你從重復無聊的代碼中解放出來,在處理器中,按照參數創建出 JavaFile之后,通Filer利用javaFile.writeTo(filer);就可以生成你需要的java文件。

4、錯誤處理,在處理器中,我們不能直接拋出一個異常,因為在process()中拋出一個異常,會導致運行注解處理器的JVM崩潰,導致跟蹤棧信息十分混亂。因此,注解處理器就有一個Messager類,一般通過messager.printMessage( Diagnostic.Kind.ERROR, StringMessage, element)即可正常輸出錯誤信息。

至此,你的注解處理器完成了所有的邏輯。可以看出,編譯時注解實在編譯時生成java文件,然后將生產的java文件注入到源碼中,在運行時并不會像運行時注解一樣,影響效率和資源。

總結

我們就利用ButterKnife的流程,簡單舉例做個總結吧。

  1. @BindView在編譯時,根據Acitvity生產了XXXActivity$$ViewBinder.java。
  2. Activity中調用的ButterKnife.bind(this);,通過this的類名字,加$$ViewBinder,反射得到了ViewBinder,和編譯處理器生產的java文件關聯起來了,并將其存在map中緩存,然后調用ViewBinder.bind()。
  3. 在ViewBinder的bind方法中,通過id,利用ButterKnife的butterknife.internal.Utils工具類中的封裝方法,將findViewById()控件注入到Activity的參數中。

好了,通過上面的流程,是不是把編譯時注解的生成和使用連接起來了呢?有問題還請各位留言談論。

責任編輯:未麗燕 來源: 戀貓月亮
相關推薦

2020-11-23 10:48:39

Golang GinW

2011-09-14 11:10:09

Android 2.2

2010-12-08 09:03:40

SQLiteAndroid

2023-08-28 09:14:20

ScrapyPython

2020-08-12 08:30:20

數據結構算法

2021-06-15 18:42:53

Rollup配置 JavaScript

2023-02-13 09:01:29

Linux驅動實例

2021-03-26 09:37:12

Java開發代碼

2015-10-29 15:36:19

Redis入門

2009-09-25 10:24:40

Androind入門教OPhone

2011-09-07 14:25:53

Android Wid設計

2023-03-27 08:12:40

源碼場景案例

2023-03-06 11:13:20

Spring注解加載

2023-03-13 08:12:25

@DependsOn源碼場景

2011-11-29 12:27:54

2009-09-24 15:27:41

Hibernate查詢

2010-06-24 13:35:53

GRE協議

2021-05-07 08:02:53

Sentinel 流量服務

2011-03-08 16:50:35

2019-12-25 15:07:43

開發技能代碼
點贊
收藏

51CTO技術棧公眾號

日本网站在线观看一区二区三区| 福利在线一区| 亚洲日穴在线视频| 国产乱人伦精品一区二区| 日本韩国欧美中文字幕| 国产尤物久久久| 日韩一区二区影院| 少妇性饥渴无码a区免费| 欧美a在线看| 91在线视频播放| 国产精品无码专区在线观看| 久久黄色免费网站| 深爱激情综合网| 日韩欧美的一区| 丁香婷婷激情网| 1024在线看片你懂得| 久久天天做天天爱综合色| 91色中文字幕| 中文字幕在线网站| 99精品欧美| 欧美成年人视频| 神马久久久久久久久久久| 99精品在免费线中文字幕网站一区 | 五十路六十路七十路熟婆| 国产私拍福利精品视频二区| 一区二区三区成人| 在线观看成人av电影| 日色在线视频| 成人h版在线观看| 亚洲一区二区三区四区在线播放| 懂色av蜜臀av粉嫩av分享吧最新章节| 亚洲午夜久久久久久尤物| 深爱激情综合| 在线观看网站黄不卡| 妞干网在线视频观看| 国产精品剧情| 国产精品免费久久久久| 日本不卡二区高清三区| 香蕉av在线播放| 国产91对白在线观看九色| 91精品久久久久久久久久久| 精品无码一区二区三区的天堂| 在线国产日韩| 欧美精品亚州精品| www色aa色aawww| 91蜜臀精品国产自偷在线| 亚洲最新视频在线| 色噜噜日韩精品欧美一区二区| 牛牛精品成人免费视频| 亚洲成人999| 伊人久久久久久久久| 在线日韩成人| 欧美mv和日韩mv的网站| 国产清纯白嫩初高中在线观看性色| 9999在线精品视频| 91精品国产综合久久久久久久 | 亚洲欧美成人在线| 久久精品国产亚洲av麻豆| 日本久久成人网| 日韩精品极品视频免费观看| 久久人人爽人人爽人人片| 久久动漫网址| 亚洲男人第一网站| a天堂中文字幕| 波多野结衣一区| 少妇高潮久久77777| 国产jizz18女人高潮| 91欧美在线| 欧美www在线| 国产真实夫妇交换视频| 亚洲少妇在线| 国产精品国产三级国产aⅴ浪潮| 依依成人在线视频| 国产一区视频导航| 国产日韩欧美综合精品| 日韩在线免费播放| 国产精品私人影院| 日本美女爱爱视频| 黄色在线免费观看网站| 91国内精品野花午夜精品| 激情 小说 亚洲 图片: 伦| av日韩久久| 亚洲国产成人av在线| 成人在线一级片| 久久久国产精品| 国内精品久久久久影院优| 香蕉污视频在线观看| 精品一区二区免费看| 国产精品日韩欧美一区二区三区| 久久精品蜜桃| 一区二区三区久久| 乱子伦视频在线看| 精品国产三区在线| 日韩精品在线第一页| 亚洲欧洲综合网| 在线成人www免费观看视频| 国产精品久久婷婷六月丁香| 精品国产av 无码一区二区三区 | 黑人と日本人の交わりビデオ| 一区二区不卡| 热草久综合在线| 国产jzjzjz丝袜老师水多| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲成人自拍视频| 国产不卡123| 69堂国产成人免费视频| 丰满少妇一区二区三区| 欧美一区二区三区久久精品茉莉花 | 美女精品国产| 午夜小视频在线观看| 日本韩国欧美三级| 熟妇高潮一区二区| 天天影视综合| 国产精品流白浆视频| 亚洲精品视频网| 中文字幕在线观看不卡| 欧美xxxxx在线视频| 欧美激情三级| 久久久国产91| 中文天堂在线播放| 91免费版在线| 草b视频在线观看| 成人污污www网站免费丝瓜| 亚洲视频一区二区| 国产成人自拍视频在线| 国产寡妇亲子伦一区二区| 欧美日韩在线一区二区三区| av资源在线看片| 欧美成人猛片aaaaaaa| 99自拍视频在线| 日本亚洲一区二区| 欧美日韩国产精品一区二区| 9999在线视频| 精品免费99久久| 国产精品 欧美激情| 久久99久久99小草精品免视看| 无码免费一区二区三区免费播放| 亚洲欧洲日本韩国| 亚洲精品一区二区在线| 日韩免费不卡视频| 国产91丝袜在线播放0| 少妇久久久久久被弄到高潮| 3d动漫一区二区三区在线观看| 中文字幕最新精品| 中文字幕人妻一区二区在线视频| 国产亚洲美州欧州综合国| 日本成年人网址| 亚洲精品国产动漫| 日韩女优在线播放| 国产视频第一页在线观看| 在线观看免费一区| 精品一区二区三区蜜桃在线| 免费成人av资源网| 亚洲一区二区三区精品在线观看| 日韩一区二区三区四区五区| 中文字幕亚洲激情| 91av国产精品| 亚洲精品久久久久久国产精华液 | 99这里只有精品| 日本午夜激情视频| 宅男在线一区| 国产精品美女www| 日本在线视频站| 欧美一级二级三级蜜桃| 久草福利资源在线观看| 成人福利视频在线看| 九九九九免费视频| 国产一区二区三区四区五区| 国产精品一久久香蕉国产线看观看| jzzjzzjzz亚洲成熟少妇| 欧美一区二区三区啪啪| 久久免费精彩视频| 久久久综合视频| www.夜夜爽| 欧美午夜久久| 欧美视频1区| 视频欧美精品| 高清在线视频日韩欧美| 婷婷丁香一区二区三区| 在线视频国产一区| www.毛片com| 久久一区二区三区四区| 在线观看亚洲色图| 欧美日本一区| 免费av在线一区二区| 五月天色综合| 91av在线免费观看视频| yes4444视频在线观看| 日韩免费看网站| 男人天堂2024| 亚洲激情网站免费观看| 最新中文字幕视频| 国产在线精品国自产拍免费| 日韩中文字幕三区| 亚洲欧美色图| 日本一区二区三区免费看| 精品国产一区二| 青草成人免费视频| 2020国产在线视频| 亚洲热线99精品视频| 亚洲伦理在线观看| 欧美无乱码久久久免费午夜一区| 久久国产露脸精品国产| 国产精品美日韩| 精品国产av色一区二区深夜久久| 国产中文字幕精品| 日韩av在线综合| 欧美视频官网| 伊人久久av导航| 婷婷综合一区| 国产精品一区二| 91成人app| 国产精品对白刺激| 欧美aa在线| 欧美激情影音先锋| 久久77777| 色哟哟入口国产精品| 四虎精品在永久在线观看| 欧美一区二区三区视频免费 | 黄色a级片在线观看| 久久亚区不卡日本| 性xxxxxxxxx| 韩国v欧美v亚洲v日本v| 玩弄japan白嫩少妇hd| 亚洲黄色毛片| 国产美女作爱全过程免费视频| 久久五月天小说| 日韩福利视频| 免费av一区| 久久99欧美| 美女av一区| 国产一区二区三区色淫影院| 一区二区三区亚洲变态调教大结局 | 五月激情六月丁香| 亚洲成av人**亚洲成av**| 欧美毛片在线观看| 亚洲免费观看高清完整版在线观看熊| 肉色超薄丝袜脚交69xx图片 | 中韩乱幕日产无线码一区| 国产91精品不卡视频| 日本免费一区二区六区| 韩国三级电影久久久久久| 操喷在线视频| 97在线视频免费看| 91桃色在线观看| 国外色69视频在线观看| 日韩成人在线免费视频| 国产高清中文字幕在线| 日韩精品亚洲精品| 天堂网在线资源| 日韩成人在线电影网| 亚洲aⅴ乱码精品成人区| 国产日韩欧美综合一区| www.久久国产| 久久精品一区二区| 精品亚洲aⅴ无码一区二区三区| 国产三级欧美三级| 成人精品一二三区| 亚洲欧美视频在线观看| 久草视频手机在线观看| 亚洲风情在线资源站| 国产午夜性春猛交ⅹxxx| 欧美日韩性生活视频| 波多野结衣家庭主妇| 欧美三片在线视频观看| 亚洲一区二区激情| 日韩一区二区在线播放| 四虎永久在线观看| 亚洲色图美腿丝袜| 成人三级网址| 久久久久久国产精品| 深夜成人影院| 亚洲一区二区三区香蕉| 玖玖玖免费嫩草在线影院一区| 日韩aⅴ视频一区二区三区| 欧美第一精品| 拔插拔插海外华人免费| 久久婷婷麻豆| 亚洲天堂一区二区在线观看| 99久久婷婷国产综合精品| 国产毛片欧美毛片久久久| 亚洲精选视频在线| 一级片中文字幕| 欧美日韩高清一区二区三区| 成人h动漫精品一区二区无码| 日韩精品黄色网| 欧美69xxx| 69av成年福利视频| 天堂综合在线播放| 国产欧美日韩亚洲| 日韩精品影视| 国产h视频在线播放| 美女网站一区二区| 亚洲蜜桃精久久久久久久久久久久| 国产精品天干天干在线综合| 国产午夜久久久| 欧美久久高跟鞋激| 天堂91在线| 色中色综合影院手机版在线观看| 午夜日韩成人影院| 翡翠波斯猫1977年美国| 成人免费在线播放| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 经典三级在线一区| a级大片在线观看| 亚洲国产wwwccc36天堂| 亚洲视频中文字幕在线观看| 亚洲精品97久久| 最新日本在线观看| 国产精品日韩在线一区| 久久影视三级福利片| 女人床在线观看| 美女任你摸久久 | 丁香五月缴情综合网| 亚洲日本欧美在线| 久久福利精品| 成人做爰www看视频软件| 亚洲欧洲精品成人久久奇米网 | 91精品免费在线观看| 国产私拍精品| 日本免费在线精品| 欧美亚洲tv| 欧美视频免费看欧美视频| 国内精品不卡在线| 久久视频一区二区三区| 欧美综合视频在线观看| 精品影院一区| 欧洲精品在线视频| 日韩aaa久久蜜桃av| 久激情内射婷内射蜜桃| 粉嫩av亚洲一区二区图片| 欧美日韩一级在线观看| 欧美一级生活片| 国产原创视频在线观看| 91精品国产综合久久香蕉| 国产精品自拍区| 老头吃奶性行交视频| 久久久久久**毛片大全| 男人午夜免费视频| 精品视频偷偷看在线观看| 毛片在线网站| 久久久99爱| 免费国产自线拍一欧美视频| 黄色a一级视频| 一本大道久久a久久综合婷婷| 亚洲色欧美另类| 国产97色在线| 成人久久一区| 成人日韩在线视频| 综合久久一区二区三区| 国产老女人乱淫免费| 欧美xxxx18性欧美| 高潮久久久久久久久久久久久久| a级黄色小视频| 91免费版在线| 91丨九色丨海角社区| 日韩在线观看精品| 豆花视频一区| 九九热只有这里有精品| 99国产欧美另类久久久精品| 国产亚洲欧美在线精品| 夜夜嗨av色综合久久久综合网| 国产乱子精品一区二区在线观看| 这里只有精品66| 国产成人免费视频精品含羞草妖精| 日本在线视频免费观看| 亚洲美女中文字幕| 123成人网| av久久久久久| 久久一区二区视频| 亚洲网站在线免费观看| 欧美成人免费在线观看| 精品国产一区二区三区成人影院| 免费av网址在线| 亚洲三级电影网站| 亚洲欧洲综合在线| 国产精品视频免费在线| 欧美精品国产一区二区| 黄色短视频在线观看| 欧美日韩在线精品一区二区三区激情| 51xtv成人影院| 久久精品美女| 激情成人午夜视频| 好吊操这里只有精品| 国产一区二区三区网站| 国产一区二区av在线| 黑鬼大战白妞高潮喷白浆| 中文字幕日韩精品一区| 五月婷婷在线播放| 国产综合久久久久| 亚洲综合99| 日韩一区二区三区四区在线| 亚洲精品日韩久久久| 精品视频国内| 免费黄色一级网站| 亚洲第一搞黄网站| 中文日本在线观看| 欧美日韩成人一区二区三区 | 亚洲国产av一区| 日韩欧美综合一区|