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

看到最后,你才發現Java中注解原來是這么做到的!

開發 前端
用于定義注解的注解,通常用于注解的定義上,標明該注解的使用范圍、生效范圍等。簡而言之,元注解是用來修飾注解的。

?概述

注解想必大家在項目中經常使用,比如Spring框架中常用的一些注解:@Controller、@Service、@RequestMapping等等,它是JDK1.5及以后版本引入的一個特性。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。那么你知道JDK什么是元注解嗎?注解有哪些分類嗎?以及注解在Java中最本質究竟是什么東西,是如何實現的呢?

注解的分類

根據注解的使用場景,主要分為三類,元注解、內置注解和自定義注解。

元注解

用于定義注解的注解,通常用于注解的定義上,標明該注解的使用范圍、生效范圍等。簡而言之,元注解是用來修飾注解的。

@Retention

指定注解信息保留到哪個階段,分別為源代碼階段、編譯Class階段、運行階段。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
  • SOURCE: 保留在源代碼java中,被編譯器丟棄,也就是說在class文件中不包含注解信息,通常用來標記源碼,引起大家的注意,比如自定義一個注解例如@ThreadSafe,用來標識一個類時線程安全的。
  • CLASS: 編譯后的class文件中包含注解信息,但是會被jvm丟棄
  • RUNTIME: 注解信息在運行期(JVM)保留(.class也有),可以通過反射機制讀取注解的信息

@Target

指定注解的使用范圍,如類、方法、屬性、局部屬性、參數等, 可以多選。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}

具體可選的枚舉如下:

public enum ElementType {
/** 適用范圍:類、接口、注解類型,枚舉類型enum */
TYPE,
/** 作用于類屬性 (includes enum constants) */
FIELD,
/** 作用于方法 */
METHOD,
/** 作用于參數聲明 */
PARAMETER,
/** 作用于構造函數聲明 */
CONSTRUCTOR,
/** 作用于局部變量聲明 */
LOCAL_VARIABLE,
/** 作用于注解聲明 */
ANNOTATION_TYPE,
/** 作用于包聲明 */
PACKAGE,
/** 作用于類型參數(泛型參數)聲明 */
TYPE_PARAMETER,
/** 作用于使用類型的任意語句(不包括class) */
TYPE_USE
}

@Inherited

加上該注解的注解,表示可以被標注的類子類繼承,比如A上標記了帶有@Inherited的注解,那么類B繼承了A, 那么B也會有這個注解,默認情況下注解是不支持繼承的。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

@Document

將此注解包含在 javadoc 中 ,它代表著此注解會被javadoc工具提取成文檔。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

@Repeatable

1.8中加入的元注解,用來標記是否可以重復標記。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
/**
* Indicates the <em>containing annotation type</em> for the
* repeatable annotation type.
* @return the containing annotation type
*/
Class<? extends Annotation> value();
}

內置注解

java提供了一些內置注解,可以配合編譯器來檢查代碼的正確性, 我們可以關注他們的元注解。

@Override

標記當前方法是覆寫父類的方法。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Deprecated

標記一個元素為已過期,不要在使用了

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

@SuppressWarnings

用來關閉編譯器輸出的警告信息

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}

@FunctionalInterface

java8中引入,標記是一個函數式接口,也就是說有且只有一個抽象方法的接口

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

自定義注解

注解遵循的格式一般如下:

//元注解部分 xxxx
@Retention(xxxx)
@Target(xxxx)
public @interface 注解名 {
返回值 屬性名() 默認值;
返回值 屬性名() 默認值;
}
  • 返回值支持的類型如下:java的8種基礎類型(不支持包裝類型)、String、Class、Enum、Annotation、以及上面類型的數組。
  • 默認值可選,非必有。

舉個項目中自定義的栗子:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataAuthorize {
/**
* 資產ID
* @return
*/
String assetId();

/**
* 資產類型
* @return
*/
String assetType();

/**
* 權限代碼
* @return
*/
String authCode() default "";

/**
* 使用的類型
* @return
*/
Class[] useType();
}

使用反射操作注解

大部分情況下,我們的項目或者開源框架中都定義了大量的注解,而且都是@Retention(RetentionPolicy.RUNTIME)運行時階段,我們可以通過反射獲取注解中的信息,所以整體遵循下面的一個范式。

  1. 自定義注解
  2. 掃描注解
  3. 通過反射獲取注解的信息,執行相應的邏輯。

下面我們重點使用下如何用反射來獲取注解的信息。

  1. 定義target是注解的注解
@Inherited
@Retention( value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.ANNOTATION_TYPE})
public @interface AnnoTest {

String value() default "anno";

}
  1. 定義一個幾乎全量信息的注解
@AnnoTest("alvinAnno")
@Inherited
@Retention( value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE_USE,ElementType.PACKAGE,ElementType.FIELD,
ElementType.TYPE_PARAMETER,ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE})
@Documented
public @interface FullAnnoTest {

String value() default "FullAnnoTest";

}
  1. 定義測試類和反射代碼
@FullAnnoTest("package")
package com.alvin.java.core.anno;

public class ParentObj {
}



@FullAnnoTest("testAnnoReflect")
public class TestAnnoReflect<@FullAnnoTest("parameter") T > extends @FullAnnoTest("parent")ParentObj {

@FullAnnoTest("constructor")
TestAnnoReflect() {
}

//注解字段域
private @FullAnnoTest("name") String name;
//注解泛型字段域
private @FullAnnoTest("value") T value;
//注解通配符
private @FullAnnoTest("list") List<@FullAnnoTest("generic") ?> list;
//注解方法
@FullAnnoTest("method") //注解方法參數
public String hello(@FullAnnoTest("methodParameter") String name)
throws @FullAnnoTest("Exception") Exception { // 注解拋出異常
//注解局部變量,現在運行時暫時無法獲?。ê雎裕?br> @FullAnnoTest("result") String result;
result = "siting";
System.out.println(name);
return result;
}

public static void main(String[] args) throws Exception {

TestAnnoReflect<String> TestAnnoReflect = new TestAnnoReflect<> ();
Class<TestAnnoReflect<Object>> clazz = (Class<TestAnnoReflect<Object>>) TestAnnoReflect.getClass();
//class的注解
Annotation[] annotations = clazz.getAnnotations();
FullAnnoTest testTmp = (FullAnnoTest) annotations[0];
System.out.println("修飾TestAnnoReflect.class注解value: "+testTmp.value());
//構造器的注解
Constructor<TestAnnoReflect<Object>> constructor = (Constructor<TestAnnoReflect<Object>>) clazz.getDeclaredConstructors()[0];
testTmp = constructor.getAnnotation(FullAnnoTest.class);
System.out.println("修飾構造器的注解value: "+testTmp.value());
//繼承父類的注解
AnnotatedType annotatedType = clazz.getAnnotatedSuperclass();
testTmp = annotatedType.getAnnotation(FullAnnoTest.class);
System.out.println("修飾繼承父類的注解value: "+testTmp.value());
//注解的注解
AnnoTest AnnoTest = testTmp.annotationType().getAnnotation(AnnoTest.class);
System.out.println("修飾注解的注解AnnoTest-value: "+AnnoTest.value());
//泛型參數 T 的注解
TypeVariable<Class<TestAnnoReflect<Object>>> variable = clazz.getTypeParameters()[0];
testTmp = variable.getAnnotation(FullAnnoTest.class);
System.out.println("修飾泛型參數T注解value: "+testTmp.value());
//普通字段域 的注解
Field[] fields = clazz.getDeclaredFields();
Field nameField = fields[0];
testTmp = nameField.getAnnotation(FullAnnoTest.class);
System.out.println("修飾普通字段域name注解value: "+testTmp.value());
//泛型字段域 的注解
Field valueField = fields[1];
testTmp = valueField.getAnnotation(FullAnnoTest.class);
System.out.println("修飾泛型字段T注解value: "+testTmp.value());
//通配符字段域 的注解
Field listField = fields[2];
AnnotatedParameterizedType annotatedPType = (AnnotatedParameterizedType)listField.getAnnotatedType();
testTmp = annotatedPType.getAnnotation(FullAnnoTest.class);
System.out.println("修飾泛型注解value: "+testTmp.value());
//通配符注解 的注解
AnnotatedType[] annotatedTypes = annotatedPType.getAnnotatedActualTypeArguments();
AnnotatedWildcardType annotatedWildcardType = (AnnotatedWildcardType) annotatedTypes[0];
testTmp = annotatedWildcardType.getAnnotation(FullAnnoTest.class);
System.out.println("修飾通配符注解value: "+testTmp.value());
//方法的注解
Method method = clazz.getDeclaredMethod("hello", String.class);
annotatedType = method.getAnnotatedReturnType();
testTmp = annotatedType.getAnnotation(FullAnnoTest.class);
System.out.println("修飾方法的注解value: "+testTmp.value());
//異常的注解
annotatedTypes = method.getAnnotatedExceptionTypes();
testTmp = annotatedTypes[0].getAnnotation(FullAnnoTest.class);
System.out.println("修飾方法拋出錯誤的注解value: "+testTmp.value());
//方法參數的注解
annotatedTypes = method.getAnnotatedParameterTypes();
testTmp = annotatedTypes[0].getAnnotation(FullAnnoTest.class);
System.out.println("修飾方法參數注解value: "+testTmp.value());
//包的注解
Package p = Package.getPackage("com.alvin.java.core.anno");
testTmp = p.getAnnotation(FullAnnoTest.class);
System.out.println("修飾package注解value: "+testTmp.value());
TestAnnoReflect.hello("hello");
}

}
  1. 查看對應的執行結果
修飾TestAnnoReflect.class注解value: testAnnoReflect
修飾構造器的注解value: constructor
修飾繼承父類的注解value: parent
修飾注解的注解AnnoTest-value: alvinAnno
修飾泛型參數T注解value: parameter
修飾普通字段域name注解value: name
修飾泛型字段T注解value: value
修飾泛型注解value: list
修飾通配符注解value: generic
修飾方法的注解value: method
修飾方法拋出錯誤的注解value: Exception
修飾方法參數注解value: methodParameter
修飾package注解value: package
hello

注解的本質和底層實現

大家有沒有想過注解的本質是什么?

我們先通過反編譯查看注解生成的字節碼,可以通過javap -v FullAnnoTest.class查看如下:

圖片

可以看到,我們的注解是繼承自Annotation接口。

public interface Annotation {
boolean equals(Object obj);

int hashCode();

String toString();

/**
* Returns the annotation type of this annotation.
* @return the annotation type of this annotation
*/
Class<? extends Annotation> annotationType();
}

所以注解相當于一個語法糖一樣,可以方便我們使用,本質上它是繼承自Annotation的一個接口。

那大家有沒有想過它的實現類在哪里?比如下面的代碼,獲取到注解,按照上面的解釋,它是一個接口,那調用value()方法時,它具體調用的哪個實現類呢?我們并沒有寫實現類啊.....

答案當然就是動態代理生成的實現類。

AnnoTest annoTest = testTmp.annotationType().getAnnotation(AnnoTest.class);
System.out.println("修飾注解的注解AnnoTest-value: "+annoTest.value());

我們可以在啟動參數添加如下命令可以查看生成的代理類:-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true

圖片

執行后,生成代理類如下,

圖片

代理大致的代碼如下:

public final class $Proxy2 extends Proxy implements FullAnnoTest {
private static Method m1;
private static Method m2;
private static Method m4;
private static Method m0;
private static Method m3;

public $Proxy2(InvocationHandler var1) throws {
super(var1);
}

public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}



public final Class annotationType() throws {
try {
return (Class)super.h.invoke(this, m4, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}

public final String value() throws {
try {
return (String)super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}

static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m2 = Class.forName("java.lang.Object").getMethod("toString");
m4 = Class.forName("com.alvin.java.core.anno.FullAnnoTest").getMethod("annotationType");
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
m3 = Class.forName("com.alvin.java.core.anno.FullAnnoTest").getMethod("value");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}

我們看value()?方法,這里調用了super.h對象,也就是InvocationHandler?對象,而我們注解用的是AnnotationInvocationHandler這個子類,我們在invoke方法中打個斷點,就明白了~~

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2022-01-14 14:19:38

ReactTS前端

2020-02-23 15:55:00

疫情AI人工智能

2021-02-07 08:13:18

@DateTimeFo@NumberFormSpring

2017-11-12 21:12:34

HPC

2019-10-08 12:32:07

運維架構技術

2021-07-29 16:56:59

微信騰訊注冊

2025-04-03 10:39:56

2020-06-30 08:12:32

VMwareKVMDocker

2022-08-15 08:01:00

三色標記JVM算法

2025-07-03 07:05:00

JavaScriptPromise代碼

2024-10-11 11:59:03

2017-06-06 15:13:07

2020-05-26 08:52:36

Java JVM多態

2022-12-14 07:32:40

InnoDBMySQL引擎

2021-08-17 07:00:00

雙重檢查鎖Nacos

2023-07-26 00:32:33

注解抽象spring

2015-08-05 10:50:01

Facebook緩存網頁

2013-03-29 09:54:05

創業創業者

2020-09-24 06:44:54

HTTPS網站 HTTP

2024-02-21 23:03:56

代碼系統
點贊
收藏

51CTO技術棧公眾號

欧美一级免费在线观看| 日韩高清国产一区在线| 欧美日韩国产一区二区| 91精品国产网站| 污片免费在线观看| 国产网站在线| 久久久久久久精| 欧美成在线视频| 一区二区三区四区影院| 国产精品xx| 91色.com| 国产欧美一区二区三区久久人妖 | 久久精品—区二区三区舞蹈| 性欧美xxx69hd高清| 国产米奇在线777精品观看| 久久这里只有精品99| 少妇熟女视频一区二区三区| 亚洲优女在线| 久久精品欧美一区二区三区不卡| 欧美日韩成人免费| 亚洲av成人片色在线观看高潮 | 女人扒开腿免费视频app| 中文字幕中文字幕在线中高清免费版| 日韩中文欧美在线| 色多多国产成人永久免费网站| 国产成人在线免费看| 成人精品福利| 成人一区在线看| 国产精品jizz在线观看麻豆| www.97视频| 欧美大胆视频| 欧美三级乱人伦电影| 久久综合福利| 国产美女无遮挡永久免费| 99国产精品久久久久久久 | 成人性生交大片免费看视频直播| 久久久精品三级| 国内精品不卡| 久久久亚洲精品石原莉奈| 91美女片黄在线观| 青青国产在线观看| 五月亚洲婷婷| 欧美在线免费播放| 国产精品日韩三级| 五月婷婷综合久久| 国内成人精品2018免费看| 一本一道久久a久久精品逆3p| 日本黄色三级大片| 国产原创精品视频| 久久久蜜臀国产一区二区| 91丨九色丨国产在线| 无码日韩精品一区二区| 亚洲视频观看| 久久国产天堂福利天堂| 中文字幕在线观看视频www| 日韩欧美一区二区三区免费观看| 国产日韩av一区| 国产免费一区二区三区| 日韩黄色a级片| 你懂的国产精品永久在线| 国产亚洲一区二区在线| 成人网站免费观看| 99re久久| 欧美亚洲综合一区| 成年人视频在线免费| 波多野一区二区| 一区二区三区四区高清精品免费观看| 国产精品美女黄网| 亚洲AV无码精品色毛片浪潮| 久久99精品久久久久久动态图| 萌白酱国产一区二区| 国产一级淫片久久久片a级| 国产精品一在线观看| 欧洲精品在线观看| 国产乱淫av片杨贵妃| 手机av在线播放| 一区二区三区视频在线观看| 五月综合激情日本mⅴ| 欧洲精品国产| 丰满人妻一区二区三区四区53 | 成人欧美magnet| 亚洲综合免费观看高清完整版| 久久精品国产精品青草色艺| 天天天天天天天干| 久久国产直播| 国产精品第8页| 这里只有精品国产| 黄色av一区| 久久久久久久久电影| 久久香蕉精品视频| 亚洲激情专区| 欧美综合激情网| 国产女主播喷水视频在线观看| 欧美在线91| 欧美福利小视频| 国产香蕉在线视频| 午夜在线视频观看日韩17c| 日本一区二区三区在线播放| 无码一区二区三区| 久久成人免费网| 91在线精品播放| 99久久99久久久精品棕色圆| 国产精品77777竹菊影视小说| 欧美又大又粗又长| 国产一区二区视频网站| 麻豆精品新av中文字幕| 97在线视频观看| 天堂免费在线视频| 久久99精品久久久久久国产越南| 国产福利精品av综合导导航| 91福利在线观看视频| 国产毛片精品一区| 国产乱肥老妇国产一区二| 国产一区二区三区四区视频| 六月丁香综合| 91久久国产精品91久久性色| 蜜桃久久一区二区三区| 久久久久国产精品厨房| 激情五月综合色婷婷一区二区 | 国产精品国产a| 一区二区精品免费视频| 日韩专区av| 一本久道久久综合中文字幕| 在线视频日韩欧美| 欧美日韩精品一区二区三区在线观看| 日韩一区二区三区电影在线观看 | 最近中文字幕免费mv2018在线| 日本一区二区不卡视频| 第九区2中文字幕| sis001欧美| 亚洲一区二区三区四区的 | 澳门成人av| 国产亚洲精品久久久| 国产成人av一区二区三区不卡| 欧美一级三级| 欧美成人免费网| 自拍偷拍校园春色| 北条麻妃一区二区三区| 亚洲精品视频一区二区三区| 91av久久| 一区二区三区美女视频| 国产免费视频传媒| 一区二区三区亚洲变态调教大结局 | 91色精品视频在线| 九九在线视频| 精品二区三区线观看| 午夜福利123| 极品美女一区二区三区| 性日韩欧美在线视频| 国产乱码一区二区| 国产精品一二三| 在线观看欧美一区| 亚洲欧洲日本专区| 浓精h攵女乱爱av| 噜噜噜狠狠夜夜躁精品仙踪林| 91精品国产综合久久久久久久久久 | 日韩中文字幕免费视频| 日本亚洲欧美在线| 精品一区精品二区高清| 婷婷久久青草热一区二区| 久久久久黄久久免费漫画| 欧美性20hd另类| 亚洲自拍偷拍精品| 欧美成人久久| 亚洲一区中文字幕| h视频在线免费| 日韩欧美a级成人黄色| 手机免费看av片| 亚洲无线一线二线三线区别av| 久久久久成人精品| 草逼视频免费看| 麻豆福利在线观看| 欧美性感美女h网站在线观看免费| 国产a级片免费观看| 亚洲性视频在线| 日韩视频中文字幕| 99精品视频免费看| 亚洲v日本v欧美v久久精品| 欧美肉大捧一进一出免费视频 | 国产盗摄女厕一区二区三区| 福利视频免费在线观看| 日韩福利视频一区| 国产精品入口尤物| 最新国产在线拍揄自揄视频| 亚洲高清久久久久久| 久久亚洲精品石原莉奈| 中文字幕中文字幕在线一区| 精人妻一区二区三区| 久久国产精品99国产| 成人h在线播放| 少妇在线看www| 日韩在线视频免费观看| 性高潮视频在线观看| 久久伊99综合婷婷久久伊| 男人添女人下面免费视频| 午夜欧美理论片| 日本一区二区高清视频| 亚洲精品视频一二三区| 国产99视频在线观看| 99视频免费在线观看| 亚洲乱码一区二区| www.久久久久久| 在线亚洲人成电影网站色www| 国产精品视频最多的网站| 中文字幕在线播出| 亚洲图片欧美综合| 成人在线手机视频| 成人妖精视频yjsp地址| 欧美精品一区二区三区免费播放| 亚洲深夜福利在线观看| 成人久久精品视频| 黑人巨大精品| 中文字幕日韩精品在线| 中文字幕日日夜夜| 亚洲福利一二三区| www.xx日本| 久久久国产精品麻豆| 欧美日韩亚洲自拍| 伊人天天综合| 日韩精品第1页| 国产精品三级| 国产一区二区无遮挡| 国产精品亚洲综合在线观看| 日本中文字幕成人| 韩日毛片在线观看| 欧美激情免费在线| 黄色一级片在线观看| 在线成人免费网站| 色视频在线看| 亚洲精品久久视频| 波多野结衣大片| 欧美日韩亚洲精品一区二区三区| 人成免费在线视频| 久久一区二区视频| 欧美做受喷浆在线观看| 成人免费视频国产在线观看| 18深夜在线观看免费视频| 国产欧美不卡| 国产成人一区二区三区别| 日韩大片在线免费观看| 成人欧美视频在线| 久久99精品久久久野外观看| 91精品久久久久久久久中文字幕| www.综合网.com| 欧美成人精品xxx| 国内三级在线观看| 91精品国产综合久久精品| 一二三区在线播放| 欧美日韩激情在线| 91国产精品一区| 91麻豆精品久久久久蜜臀| 一本色道久久综合亚洲| 欧美日韩国产美女| 中文字幕人妻一区二区三区视频| 午夜欧美大尺度福利影院在线看| 男女全黄做爰文章| 国产精品美女久久久久久久久久久| 欧美熟妇精品一区二区蜜桃视频| 精品在线免费观看| 六月丁香婷婷在线| 丰满少妇乱子伦精品看片| 国产在线国偷精品产拍免费yy| 波多野结衣乳巨码无在线| 亚洲欧洲日本一区二区三区| 无码播放一区二区三区| 久久九九电影| 亚洲综合色在线观看| 国产一区二区三区四区在线观看| 50路60路老熟妇啪啪| 国产在线日韩| 黄色一级视频片| 久久中文在线| www.com毛片| 日本不卡一二三区黄网| 日韩va在线观看| 不卡电影免费在线播放一区| 日韩中文字幕电影| 亚洲同性同志一二三专区| 日韩免费一二三区| 在线免费观看日韩欧美| 国产精品一区二区免费视频 | 福利视频一区二区三区四区| 99成人精品| 欧美伦理片在线观看| 国产福利一区二区三区视频| 在线视频 日韩| 国产精品99久久久久久久女警 | 日本aⅴ亚洲精品中文乱码| 日本人体一区二区| 亚洲国产欧美国产综合一区| 黄色片视频在线播放| 中国女人久久久| 岛国毛片在线播放| 波多野洁衣一区| 亚洲黄色免费在线观看| 国产精品区一区二区三区| 国产第一页在线播放| 欧洲精品中文字幕| 亚洲免费不卡视频| 中日韩午夜理伦电影免费| 性xxxfreexxxx性欧美| 久久影视电视剧免费网站| а√天堂中文资源在线bt| 国产精品激情av电影在线观看 | 午夜看片在线免费| 欧美日韩福利在线观看| 国产精品亚洲一区二区三区在线观看| 欧美亚洲另类在线| 亚洲图片小说区| 国产一区国产精品| 亚洲成人一区| 欧美日韩在线成人| 日本人妖一区二区| 午夜在线观看av| 9999精品| 亚洲国产三级网| 久久视频www| 久久久久久久电影一区| 欧美激情不卡| 免费看成人片| 亚洲精选在线| ass极品水嫩小美女ass| 国产精品日韩精品欧美在线| 麻豆成人免费视频| 在线免费观看视频一区| 婷婷五月综合激情| 亚洲人成电影在线播放| xxx.xxx欧美| 国产精品久久久久久久久| 白嫩亚洲一区二区三区| 神马影院午夜我不卡影院| 亚洲一区二区三区高清不卡| 国产一区二区在线免费播放| 久久久久国产精品麻豆ai换脸 | 天堂中文在线官网| 久久久国产一区二区| 巨胸喷奶水www久久久| 欧美一区二区三区在线播放| 亚洲一区网站| 精品人妻一区二区三区香蕉| 欧美日韩国产精品一区二区不卡中文 | 欧美视频国产精品| 亚洲老妇色熟女老太| 欧美成人激情视频| 日韩欧美看国产| 97在线资源站| 国产精品啊啊啊| 国产一区二区在线免费播放| 丁香桃色午夜亚洲一区二区三区| 久久久久久久毛片| 日韩欧美高清视频| 可以在线观看的黄色| 1769国内精品视频在线播放| 日韩黄色网络| 欧在线一二三四区| 国产女人水真多18毛片18精品视频| 久久久久黄色片| 欧美精品一区二区三区蜜桃视频| 自拍视频在线免费观看| 国产欧美一区二区三区在线看| 日韩欧美国产大片| av动漫免费看| 欧美高清在线一区| 国产精品熟女久久久久久| 久久这里只有精品99| 欧美视频三区| 人人干视频在线| 久久久久久麻豆| 亚洲一级片免费看| 色综合91久久精品中文字幕| 久久久久久毛片免费看| 女人天堂av手机在线| 久久久久九九视频| 91麻豆成人精品国产| 欧美精品久久久久久久久久| 香蕉人人精品| www.久久久久久久久久久| 亚洲午夜私人影院| 久久免费看视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩视频在线观看国产| 蜜臀久久久99精品久久久久久| 一女三黑人理论片在线| 在线区一区二视频| 亚洲色图欧美视频| 国产福利精品av综合导导航| 亚洲成人精品| 99re久久精品国产| 亚洲午夜激情av| 国产免费av在线| yellow视频在线观看一区二区 | 久久香蕉频线观| 国产区精品视频在线观看豆花| 日韩 欧美 视频| 国产情人综合久久777777| 精品人妻少妇嫩草av无码专区| 欧美xxxx14xxxxx性爽| 亚欧日韩另类中文欧美| 成年人免费在线播放| 亚洲精品国产a久久久久久 |