黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

Java 自定義注解的魅力

瀏覽:82日期:2022-08-15 09:28:36
注解是什么?

①、引用自維基百科的內容:Java注解又稱Java標注,是JDK5.0版本開始支持加入源代碼的特殊語法 元數據 。

Java語言中的類、方法、變量、參數和包等都可以被標注。和Javadoc不同,Java標注可以通過反射獲取標注內容。在編譯器生成類文件時,標注可以被嵌入到字節碼中。Java虛擬機可以保留標注內容,在運行時可以獲取到標注內容。 當然它也支持自定義Java標注。

②、引用自網絡的內容:Java 注解是在 JDK5 時引入的新特性,注解(也被稱為 元數據 )為我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍后某個時刻非常方便地使用這些數據。

元注解是什么?

元注解 的作用就是負責注解其他注解。Java5.0定義了4個標準的meta-annotation(元注解)類型,它們被用來提供對其它 annotation類型作說明。

標準的元注解:

@Target@Retention@Documented@Inherited在詳細說這四個元數據的含義之前,先來看一個在工作中會經常使用到的 @Autowired 注解,進入這個注解里面瞧瞧: 此注解中使用到了@Target、@Retention、@Documented 這三個元注解 。

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Autowired { boolean required() default true;}@Target元注解:

@Target注解,是專門用來限定某個自定義注解能夠被應用在哪些Java元素上面的,標明作用范圍;取值在java.lang.annotation.ElementType 進行定義的。

public enum ElementType { /** 類,接口(包括注解類型)或枚舉的聲明 */ TYPE, /** 屬性的聲明 */ FIELD, /** 方法的聲明 */ METHOD, /** 方法形式參數聲明 */ PARAMETER, /** 構造方法的聲明 */ CONSTRUCTOR, /** 局部變量聲明 */ LOCAL_VARIABLE, /** 注解類型聲明 */ ANNOTATION_TYPE, /** 包的聲明 */ PACKAGE}

根據此處可以知道 @Autowired 注解的作用范圍:

// 可以作用在 構造方法、方法、方法形參、屬性、注解類型 上@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Retention元注解:

@Retention注解,翻譯為持久力、保持力。即用來修飾自定義注解的生命周期。

注解的生命周期有三個階段:

Java源文件階段; 編譯到class文件階段; 運行期階段;

同樣使用了RetentionPolicy 枚舉類型對這三個階段進行了定義:

public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. * (注解將被編譯器忽略掉) */ SOURCE, /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. * (注解將被編譯器記錄在class文件中,但在運行時不會被虛擬機保留,這是一個默認的行為) */ CLASS, /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time, so they may be read reflectively. * (注解將被編譯器記錄在class文件中,而且在運行時會被虛擬機保留,因此它們能通過反射被讀取到) * @see java.lang.reflect.AnnotatedElement */ RUNTIME}

再詳細描述下這三個階段:

①、如果被定義為 RetentionPolicy.SOURCE,則它將被限定在Java源文件中,那么這個注解即不會參與編譯也不會在運行期起任何作用,這個注解就和一個注釋是一樣的效果,只能被閱讀Java文件的人看到;

②、如果被定義為 RetentionPolicy.CLASS,則它將被編譯到Class文件中,那么編譯器可以在編譯時根據注解做一些處理動作,但是運行時JVM(Java虛擬機)會忽略它,并且在運行期也不能讀取到;

③、如果被定義為 RetentionPolicy.RUNTIME,那么這個注解可以在運行期的加載階段被加載到Class對象中。那么在程序運行階段,可以通過反射得到這個注解,并通過判斷是否有這個注解或這個注解中屬性的值,從而執行不同的程序代碼段。

注意:實際開發中的自定義注解幾乎都是使用的 RetentionPolicy.RUNTIME 。

@Documented元注解:

@Documented注解,是被用來指定自定義注解是否能隨著被定義的java文件生成到JavaDoc文檔當中。

@Inherited元注解:

@Inherited注解,是指定某個自定義注解如果寫在了父類的聲明部分,那么子類的聲明部分也能自動擁有該注解。

@Inherited注解只對那些@Target被定義為 ElementType.TYPE 的自定義注解起作用。

自定義注解實現:

在了解了上面的內容后,我們來嘗試實現一個自定義注解:

Java 自定義注解的魅力

根據上面自定義注解中使用到的元注解得知:

①、此注解的作用范圍,可以使用在類(接口、枚舉)、方法上;

②、此注解的生命周期,被編譯器保存在class文件中,而且在運行時會被JVM保留,可以通過反射讀取;

自定義注解的簡單使用:

上面已經創建了一個自定義的注解,那該怎么使用呢?下面首先描述下它簡單的用法,后面將會使用其結合攔截器和AOP切面編程進行實戰應用;

Java 自定義注解的魅力

應用場景實現

在了解了上面注解的知識后,我們乘勝追擊,看看它的實際應用場景是腫么樣的,以此加深下我們的理解;

實現的 Demo 項目是以 SpringBoot 實現的,項目工程結構圖如下:

Java 自定義注解的魅力

場景一:自定義注解 + 攔截器 = 實現接口響應的包裝

使用自定義注解 結合 攔截器 優雅的實現對API接口響應的包裝。

在介紹自定義實現的方式之前,先簡單介紹下普遍的實現方式,通過兩者的對比,才能更加明顯的發現誰最優雅。

普通的接口響應包裝方式:現在項目絕大部分都采用的前后端分離方式,所以需要前端和后端通過接口進行交互;目前在接口交互中使用最多的數據格式是 json,然后后端返回給前端的最為常見的響應格式如下:

{ #返回狀態碼 code:integer, #返回信息描述 message:string, #返回數據值 data:object}

項目中經常使用枚舉類定義狀態碼和消息,代碼如下:

/** * @author 【 木子雷 】 公眾號 * @Title: ResponseCode * @Description: 使用枚舉類封裝好的響應狀態碼及對應的響應消息 * @date: 2019年8月23日 下午7:12:50 */public enum ResponseCode { SUCCESS(1200, '請求成功'), ERROR(1400, '請求失敗'); private Integer code; private String message; private ResponseCode(Integer code, String message) {this.code = code;this.message = message; } public Integer code() {return this.code; } public String message() {return this.message; }}

同時項目中也會設計一個返回響應包裝類,代碼如下:

import com.alibaba.fastjson.JSONObject;import java.io.Serializable;/** * @author 【 木子雷 】 公眾號 * @Title: Response * @Description: 封裝的統一的響應返回類 * @date: 2019年8月23日 下午7:07:13 */@SuppressWarnings('serial')public class Response<T> implements Serializable { /** * 響應數據 */ private T date; /** * 響應狀態碼 */ private Integer code; /** * 響應描述信息 */ private String message; public Response(T date, Integer code, String message) {super();this.date = date;this.code = code;this.message = message; } public T getDate() {return date; } public void setDate(T date) {this.date = date; } public Integer getCode() {return code; } public void setCode(Integer code) {this.code = code; } public String getMessage() {return message; } public void setMessage(String message) {this.message = message; } @Override public String toString() {return JSONObject.toJSONString(this); }}

最后就是使用響應包裝類和狀態碼枚舉類 來實現返回響應的包裝了:

@GetMapping('/user/findAllUser')public Response<List<User>> findAllUser() { logger.info('開始查詢所有數據...'); List<User> findAllUser = new ArrayList<>(); findAllUser.add(new User('木子雷', 26)); findAllUser.add(new User('公眾號', 28)); // 返回響應進行包裝 Response response = new Response(findAllUser, ResponseCode.SUCCESS.code(), ResponseCode.SUCCESS.message()); logger.info('response: {} n', response.toString()); return response;}

在瀏覽器中輸入網址: http://127.0.0.1:8080/v1/api/user/findAllUser 然后點擊回車,得到如下數據:

{ 'code': 1200, 'date': [{ 'age': 26, 'name': '木子雷'},{ 'age': 28, 'name': '公眾號'} ], 'message': '請求成功'}

通過看這中實現響應包裝的方式,我們能發現什么問題嗎?

答:代碼很冗余,需要在每個接口方法中都進行響應的包裝;使得接口方法包含了很多非業務邏輯代碼;

有沒有版本進行優化下呢? en en 思考中。。。。。 啊,自定義注解 + 攔截器可以實現呀!

自定義注解實現接口響應包裝:①、首先創建一個進行響應包裝的自定義注解:

/** * @author 【 木子雷 】 公眾號 * @PACKAGE_NAME: com.lyl.annotation * @ClassName: ResponseResult * @Description: 標記方法返回值需要進行包裝的 自定義注解 * @Date: 2020-11-10 10:38 **/@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ResponseResult {}

②、創建一個攔截器,實現對請求的攔截,看看請求的方法或類上是否使用了自定義的注解:

/** * @author 【 木子雷 】 公眾號 * @PACKAGE_NAME: com.lyl.interceptor * @ClassName: ResponseResultInterceptor * @Description: 攔截器:攔截請求,判斷請求的方法或類上是否使用了自定義的@ResponseResult注解, * 并在請求內設置是否使用了自定義注解的標志位屬性; * @Date: 2020-11-10 10:50 **/@Componentpublic class ResponseResultInterceptor implements HandlerInterceptor { /** * 標記位,標記請求的controller類或方法上使用了到了自定義注解,返回數據需要被包裝 */ public static final String RESPONSE_ANNOTATION = 'RESPONSE_ANNOTATION'; /** * 請求預處理,判斷是否使用了自定義注解 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 請求的接口方法if (handler instanceof HandlerMethod) { final HandlerMethod handlerMethod = (HandlerMethod) handler; final Class<?> clazz = handlerMethod.getBeanType(); final Method method = handlerMethod.getMethod(); // 判斷是否在類對象上加了注解 if (clazz.isAnnotationPresent(ResponseResult.class)) {// 在請求中設置需要進行響應包裝的屬性標志,在下面的ResponseBodyAdvice增強中進行處理request.setAttribute(RESPONSE_ANNOTATION, clazz.getAnnotation(ResponseResult.class)); } else if (method.isAnnotationPresent(ResponseResult.class)) {// 在請求中設置需要進行響應包裝的屬性標志,在下面的ResponseBodyAdvice增強中進行處理request.setAttribute(RESPONSE_ANNOTATION, method.getAnnotation(ResponseResult.class)); }}return true; }}

③、創建一個增強Controller,實現對返回響應進行包裝的增強處理:

/** * @author 【 木子雷 】 公眾號 * @PACKAGE_NAME: com.lyl.interceptor * @ClassName: ResponseResultHandler * @Description: 對 返回響應 進行包裝 的增強處理 * @Date: 2020-11-10 13:49 **/@ControllerAdvicepublic class ResponseResultHandler implements ResponseBodyAdvice<Object> { private final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 標記位,標記請求的controller類或方法上使用了到了自定義注解,返回數據需要被包裝 */ public static final String RESPONSE_ANNOTATION = 'RESPONSE_ANNOTATION'; /** * 請求中是否包含了 響應需要被包裝的標記,如果沒有,則直接返回,不需要重寫返回體 * * @param methodParameter * @param aClass * @return */ @Override public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {ServletRequestAttributes ra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest sr = (HttpServletRequest) ra.getRequest();// 查詢是否需要進行響應包裝的標志ResponseResult responseResult = (ResponseResult) sr.getAttribute(RESPONSE_ANNOTATION);return responseResult == null ? false : true; } /** * 對 響應體 進行包裝; 除此之外還可以對響應體進行統一的加密、簽名等 * * @param responseBody 請求的接口方法執行后得到返回值(返回響應) */ @Override public Object beforeBodyWrite(Object responseBody, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {logger.info('返回響應 包裝進行中。。。');Response response;// boolean類型時判斷一些數據庫新增、更新、刪除的操作是否成功if (responseBody instanceof Boolean) { if ((Boolean) responseBody) {response = new Response(responseBody, ResponseCode.SUCCESS.code(), ResponseCode.SUCCESS.message()); } else {response = new Response(responseBody, ResponseCode.ERROR.code(), ResponseCode.ERROR.message()); }} else { // 判斷像查詢一些返回數據的情況,查詢不到數據返回 null; if (null != responseBody) {response = new Response(responseBody, ResponseCode.SUCCESS.code(), ResponseCode.SUCCESS.message()); } else {response = new Response(responseBody, ResponseCode.ERROR.code(), ResponseCode.ERROR.message()); }}return response; }}

④、最后在 Controller 中使用上我們的自定義注解;在 Controller 類上或者 方法上使用@ResponseResult自定義注解即可; 在瀏覽器中輸入網址: http://127.0.0.1:8080/v1/api/user/findAllUserByAnnotation 進行查看:

// 自定義注解用在了方法上@ResponseResult@GetMapping('/user/findAllUserByAnnotation')public List<User> findAllUserByAnnotation() { logger.info('開始查詢所有數據...'); List<User> findAllUser = new ArrayList<>(); findAllUser.add(new User('木子雷', 26)); findAllUser.add(new User('公眾號', 28)); logger.info('使用 @ResponseResult 自定義注解進行響應的包裝,使controller代碼更加簡介'); return findAllUser;}

至此我們的接口返回響應包裝自定義注解實現設計完成,看看代碼是不是又簡潔,又優雅呢。

總結:本文針對此方案只是進行了簡單的實現,如果有興趣的朋友可以進行更好的優化。

場景二:自定義注解 + AOP = 實現優雅的使用分布式鎖

分布式鎖的最常見的使用流程:

Java 自定義注解的魅力

先看看最為常見的分布式鎖使用方式的實現,然后再聊聊自定義注解怎么優雅的實現分布式鎖的使用。

普通的分布式鎖使用方式:

Java 自定義注解的魅力

通過上面的代碼可以得到一個信息:如果有很多方法中需要使用分布式鎖,那么每個方法中都必須有獲取分布式鎖和釋放分布式鎖的代碼,這樣一來就會出現代碼冗余;

那有什么好的解決方案嗎? 自定義注解使代碼變得更加簡潔、優雅;

自定義注解優雅的使用分布式鎖:①、首先實現一個標記分布式鎖使用的自定義注解:

/** * @author 【 木子雷 】 公眾號 * @PACKAGE_NAME: com.lyl.annotation * @ClassName: GetDistributedLock * @Description: 獲取redis分布式鎖 注解 * @Date: 2020-11-10 16:24 **/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface GetDistributedLock { // 分布式鎖 key String lockKey(); // 分布式鎖 value,默認為 lockValue String lockValue() default 'lockValue'; // 過期時間,默認為 300秒 int expireTime() default 300;}

②、定義一個切面,在切面中對使用了 @GetDistributedLock 自定義注解的方法進行環繞增強通知:

/** * @author: 【 木子雷 】 公眾號 * @PACKAGE_NAME: com.lyl.aop * @ClassName: DistributedLockAspect * @Description: 自定義注解結合AOP切面編程優雅的使用分布式鎖 * @Date: 2020-11-10 16:52 **/@Component@Aspectpublic class DistributedLockAspect { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired RedisService redisService; /** * Around 環繞增強通知 * * @param joinPoint 連接點,所有方法都屬于連接點;但是當某些方法上使用了@GetDistributedLock自定義注解時, * 則其將連接點變為了切點;然后在切點上織入額外的增強處理;切點和其相應的增強處理構成了切面Aspect 。 */ @Around(value = '@annotation(com.lyl.annotation.GetDistributedLock)') public Boolean handlerDistributedLock(ProceedingJoinPoint joinPoint) {// 通過反射獲取自定義注解對象GetDistributedLock getDistributedLock = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(GetDistributedLock.class);// 獲取自定義注解對象中的屬性值String lockKey = getDistributedLock.lockKey();String LockValue = getDistributedLock.lockValue();int expireTime = getDistributedLock.expireTime();if (redisService.tryGetDistributedLock(lockKey, LockValue, expireTime)) { // 獲取分布式鎖成功后,繼續執行業務邏輯 try {return (boolean) joinPoint.proceed(); } catch (Throwable throwable) {logger.error('業務邏輯執行失敗。', throwable); } finally {// 最終保證分布式鎖的釋放redisService.releaseDistributedLock(lockKey, LockValue); }}return false; }}

③、最后,在 Controller 中的方法上使用 @GetDistributedLock 自定義注解即可;當某個方法上使用了 自定義注解,那么這個方法就相當于一個切點,那么就會對這個方法做環繞(方法執行前和方法執行后)增強處理;

在瀏覽器中輸入網址: http://127.0.0.1:8080/v1/api/user/getDistributedLock 回車后觸發方法執行:

// 自定義注解的使用@GetDistributedLock(lockKey = 'userLock')@GetMapping('/user/getDistributedLock')public boolean getUserDistributedLock() { logger.info('獲取分布式鎖...'); // 寫具體的業務邏輯 return true;}

通過自定義注解的方式,可以看到代碼變得更加簡潔、優雅。

場景三:自定義注解 + AOP = 實現日志的打印

先看看最為常見的日志打印的方式,然后再聊聊自定義注解怎么優雅的實現日志的打印。

普通日志的打印方式:

Java 自定義注解的魅力

通過看上面的代碼可以知道,如果每個方法都需要打印下日志,那將會存在大量的冗余代碼;

自定義注解實現日志打印:①、首先創建一個標記日志打印的自定義注解:

/** * @Author: 【 木子雷 】 公眾號 * @PACKAGE_NAME: com.lyl.annotation * @ClassName: PrintLog * @Description: 自定義注解實現日志打印 * @Date: 2020-11-10 18:05 **/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface PrintLog {}

②、定義一個切面,在切面中對使用了 @PrintLog 自定義注解的方法進行環繞增強通知:

/** * @author: 【 木子雷 】 公眾號 * @PACKAGE_NAME: com.lyl.aop * @ClassName: PrintLogAspect * @Description: 自定義注解結合AOP切面編程優雅的實現日志打印 * @Date: 2020-11-10 18:11 **/@Component@Aspectpublic class PrintLogAspect { private final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * Around 環繞增強通知 * * @param joinPoint 連接點,所有方法都屬于連接點;但是當某些方法上使用了@PrintLog自定義注解時, * 則其將連接點變為了切點;然后在切點上織入額外的增強處理;切點和其相應的增強處理構成了切面Aspect 。 */ @Around(value = '@annotation(com.lyl.annotation.PrintLog)') public Object handlerPrintLog(ProceedingJoinPoint joinPoint) {// 獲取方法的名稱String methodName = joinPoint.getSignature().getName();// 獲取方法入參Object[] param = joinPoint.getArgs();StringBuilder sb = new StringBuilder();for (Object o : param) { sb.append(o + '; ');}logger.info('進入《{}》方法, 參數為: {}', methodName, sb.toString());Object object = null;// 繼續執行方法try { object = joinPoint.proceed();} catch (Throwable throwable) { logger.error('打印日志處理error。。', throwable);}logger.info('{} 方法執行結束。。', methodName);return object; }}

③、最后,在 Controller 中的方法上使用 @PrintLog 自定義注解即可;當某個方法上使用了 自定義注解,那么這個方法就相當于一個切點,那么就會對這個方法做環繞(方法執行前和方法執行后)增強處理;

@PrintLog@GetMapping(value = '/user/findUserNameById/{id}', produces = 'application/json;charset=utf-8')public String findUserNameById(@PathVariable('id') int id) { // 模擬根據id查詢用戶名 String userName = '木子雷 公眾號'; return userName;}

④、在瀏覽器中輸入網址: http://127.0.0.1:8080/v1/api/user/findUserNameById/66 回車后觸發方法執行,發現控制臺打印了日志:

進入《findUserNameById》方法, 參數為: 66; findUserNameById 方法執行結束。。

使用自定義注解實現是多優雅,代碼看起來簡介干凈,越瞅越喜歡;趕快去你的項目中使用吧, 嘿嘿。。。

以上就是Java 自定義注解的魅力的詳細內容,更多關于Java 自定義注解的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 小12箩利洗澡无码视频网站 | 最新成人av | 国产丝袜人妖ts黄檬 | 黄色aa视频 | 欧美日韩aa | 男女日批在线观看 | 日韩欧美中文字幕在线观看 | 92av视频| 澳门黄色录像 | 国语播放老妇呻吟对白 | 亚洲精品乱码久久久久久动图 | 久久久久久久久久久丰满 | 在线视频精品免费 | 久久综合99 | 欧美粉嫩videosex极品 | 美女视频黄是免费 | 免费在线黄网 | 一区二区三区四区在线观看视频 | 狠狠撸在线视频 | 天堂俺去俺来也www久久婷婷 | 好紧好爽好湿别拔出来视频男男 | 精品无码黑人又粗又大又长 | 少妇高潮喷水久久久久久久久久 | 亚洲国产精品日韩av不卡在线 | 成人一级网站 | 亚洲综合图色40p | 伊人久久大香线蕉av超碰演员 | 日本特级a一片免费观看 | 在线观看中文字幕视频 | 欧美大尺度做爰啪啪免费 | 中文字幕 亚洲一区 | 欧美一级性片 | 一区两区小视频 | 男女69式互吃动态图在线观看 | 亚洲色大成网站www永久一区 | 欧美成网| 朝鲜女人大白屁股ass孕交 | 日本高潮69ⅹxxx视频 | 国产资源精品 | 99久久精品免费视频 | 大尺度无遮挡激烈床震网站 | 欧美精品一区二区三区久久久 | 野花成人免费视频 | 天堂va在线观看 | 免费看一级黄色毛片 | 欧洲熟妇精品视频 | hodv一21134铃原爱蜜莉在线 | 一级黄色录象 | 真实国产露脸乱 | 在线观看一区二区三区视频 | 黄色免费片 | 亚洲视频中文字幕在线观看 | 精品久久久久久亚洲综合网站 | 亚洲色欧美另类 | 成人精品亚洲人成在线 | 日韩免费在线观看视频 | 精品少妇人妻av免费久久久 | 77777亚洲午夜久久多喷 | 宅宅少妇无码 | 国产精品欧美成人 | 麻豆视频在线免费看 | 狠狠操狠狠色 | 国产精品高潮久久 | 国产一区二区视频免费 | 精品久久久久久久久久软件 | 国产精品久久久久久久久久久久久久久久久 | 丰满熟女高潮毛茸茸欧洲 | 99爱精品| a一级黄色 | 99久久中文字幕三级久久日本 | 色香av| 青青草日韩| 色哟哟一区二区 | 久久无码av三级 | 精品一区二区三区东京热 | 成人在线激情 | 色爽av | 网红主播大秀福利视频日韩精品 | 日韩 高清 无码 人妻 | 国产对白在线 | 97高清国语自产拍 | 国产日韩成人内射视频 | 九色porny丨精品自拍 | 人妻系列无码专区无码中出 | 亚洲色大成网站www 中文字幕色婷婷在线视频 麻豆人妻少妇精品无码专区 | 91另类| 六月丁香婷婷色狠狠久久 | 国产三级视频 | 成人免费在线视频 | 国产精品一区二区三区在线看 | 国产中文视频 | 国产精品videosex极品 | 国产强伦人妻毛片 | 婷婷久久综合九色综合 | 久久夜色撩人精品国产小说 | 国产草逼网站 | 亚洲tv久久爽久久爽 | www.com毛片| 少妇浪荡h肉辣文大全69 | 国产精品毛片无遮挡高清 | 国产免费视频一区二区裸体 | 国产欧美日韩高清 | 人妻无码久久精品人妻 | 国产a三级久久精品 | 国产伦精品一区二区三区免 | 欧美三级一区 | 天天鲁一鲁摸一摸爽一爽 | 玩弄人妻少妇500系列 | 久久ww精品w免费人成 | 国产一区二区三区a | 国产成人8x视频网站入口 | 美女爆吸乳羞羞免费网站妖精 | 麻豆剧场 | 久久精品6| 韩国成年人网站 | 国产精品久久久久无码av色戒 | 国产999精品久久久 国产999精品久久久久久 | 二男一女一级一片 | 亚洲国产欧美一区二区三区丁香婷 | 国产欧美在线观看不卡 | 国产精品国产 | 国产又色又爽又黄的视频在线观看 | 日韩欧美视频免费在线观看 | 欧美精品网站在线观看 | 成人免费在线播放视频 | 在线视频精品中文无码 | 亚洲一区二区高潮无套美女 | 女女同性女同一区二区三区九色 | 欧洲精品久久 | 亚洲在线观看免费 | 在线亚欧观看2023 | 欧美日韩在线观看精品 | 影音先锋在线看片资源 | 国产欧美又粗又猛又爽 | 色狠狠色狠狠综合天天 | 伦理片在线播放无遮无挡 | 精品亚洲成a人在线观看 | 午夜片在线 | 国产三级一区 | 99国产精品视频免费观看 | 亚洲成a人片在线观看天堂无码 | 久久婷婷影视 | 午夜在线观看av | 在线看片不卡 | 国产精品国产精品国产专区蜜臀ah | 鲁夜天天末成午 | 久久久久久久久久久久久久久久久久久 | 午夜激情在线观看视频 | 九九精品视频在线观看 | 在线看免费毛片 | 福利姬液液酱喷水 | 亚洲伦理在线播放 | 一本色道久久加勒比精品 | 日批免费观看视频 | 欧美乱人伦人妻中文字幕 | 欧美风情第一页 | а√天堂8资源中文在线 | 中文文字幕一区二区三三 | 国产94在线 | 亚洲 | 欧美自拍区 | 又色又爽又黄的美女裸体网站 | 少妇29p| 婷婷开心色四房播播 | 巨乳美女在线 | 午夜爱爱影院 | 亚洲国产精彩中文乱码av | 涩视频在线观看 | 在线播放黄色网址 | 免费嗨片首页中文字幕 | 久久a久久| 国产精品女主播 | 99久久精品久久久久久ai换脸 | av香港经典三级级 在线 | 国产精品美女久久久av超清 | 亚洲国产另类久久久精品小说 | 亚洲欧美综合精品另类天天更新 | www日韩av| 国产精品一区二区久久久 | 亚洲粉嫩| 欧美成人aaaaⅴ片在线看 | av高清尿小便嘘嘘 | 乳霸冲田杏梨中文字幕担心学生的 | 免费看国产一级片 | 国产成人在线观看网站 | 高清国产视频 | ass嫩粉嫩粉嫩pⅰcs | 国产精品视频入口 | 久久99精品久久久久久秒播放器 | 亚洲第一网址 | 国产裸体bbb视频 | 国产午夜精品一区二区三区嫩草 | 怡红院成人网 | 国产精品综合网 | 欧美精选一区二区三区 | 手机成人av | 黄色三级视屏 | 丰满少妇大力进入av亚洲葵司 | 无码纯肉视频在线观看 | 一区二区三区黄色片 | 日韩视频一区二区三区在线播放免费观看 | 欧美特一级片 | 精品亚洲国产成人 | 国产精品自在线拍国产手青青机版 | 国产性在线 | 欧美一区二区三区黄色 | 一区二区三区精品 | 18禁裸男晨勃露j毛免费观看 | 岳奶大又白下面又肥又黑水多 | 狠狠搞狠狠干 | 在线精品视频一区二区三区 | www.久久| 成人精品在线观看视频 | 国产精品久久久久久久久人妻 | 国产亚洲精久久久久久蜜臀 | 国产精品久久精品三级 | 日韩欧一区二区三区 | 国产欧美一区二区精品性色超碰 | 国产高清av首播原创麻豆 | 伊人久久国产精品 | 国内av| 伊人久久婷婷五月综合97色 | 婷婷情更久日本久久久片 | 欧美精品亚洲精品日韩已满十八 | 黄色国产视频网站 | 日产欧产美韩系列久久99 | 三级毛片网站 | 日日噜噜夜夜狠狠久久蜜桃 | jizz性欧美17| 久久婷婷国产麻豆91天堂 | 亚洲狠狠操 | 久久午夜福利无码1000合集 | 中文字幕亚洲中文字幕无码码 | 男女做www免费高清视频网站 | 国产猛男猛女无套av | 日韩中出在线 | www国产亚洲精品久久网站 | 国产伦理精品一区二区三区观看体验 | 亚洲欧美一区二区三区视频 | 看黄色大片 | 日韩人妻少妇一区二区三区 | 性欧美乱束缚xxxx白浆 | 成人疯狂猛交xxx | 国产黄色美女视频 | 午夜av资源 | 黄色激情av | аⅴ天堂中文在线网 | 影音先锋中文字幕一区 | 91中文字幕永久在线 | 91久久| 国产色秀视频在线播放 | 国产高清免费av | 日本黄区免费视频观看 | 国产98在线传媒麻豆有限公司 | 国产区av| 久草在线视频精品 | 日本美脚玉足脚交 | 国产欧美一区二区三区免费视频 | 可以直接看的毛片 | 欧美不卡一区二区 | 极品尤物被啪到呻吟喷水 | videossex性糟蹋月经 | 免费午夜爽爽爽www视频十八禁 | 小柔好湿好紧太爽了国产网址 | 麻豆精品免费视频 | 亚洲精品一区二区三区不 | 美国做爰xxxⅹ性视频 | 四虎国产精品永久地址998 | 天堂а√在线中文在线新版 | 日韩一级片免费在线观看 | 亚洲天堂自拍 | 性xxxx欧美老妇506070 | aaa大片十八岁禁止 aa爱做片免费 | 欧美精品一区二区三区四区五区 | 午夜免费视频网站 | 福利视频亚洲 | a级片免费网站 | 亚洲色无码播放 | 久久99久久99精品免观看软件 | 香港三级韩国三级日本三级 | 国产精品福利小视频 | 亡は夫の上司中文字幕 | 国产亚洲精品美女久久久 | 亚欧成人 | 国产乱对白刺激在线视频 | 精品三级av无码一区 | 黄色片在哪看 | 都市激情av| 一区二区三区精品在线 | 亚洲日韩一页精品发布 | 日韩精品无码不卡无码 | 久久久久久久久久久免费av | 人人爱夜夜爽日日做蜜桃 | 亚洲成av人片一区二区密柚 | 2018天天躁,夜夜躁 | 又黄又爽又高潮免费毛片 | 国产精品伦一区二区三级视频 | 欧美激情一区二区视频 | 人妻少妇精品中文字幕av | 一本大道卡一卡二卡三乱码全集资源 | 天堂中文在线8最新版精品版软件 | 91嫩草网| 99re66热这里只有精品8 | 91看片看淫黄大片 | 久久久999久久久 | 日本中文字幕视频在线 | 国产一区二区精品久久 | 国产欧美一区二区三区在线 | 国产黄a三级三级三级看三级黑人 | 日韩avcom| 中文字幕欧美日韩va免费视频 | 国产精品亚洲一区二区三区 | 东北少妇不戴套对白第一次 | 波多野结衣91 | 成人手机在线视频 | 国产中文字幕第一页 | 欧美午夜免费 | 九九视频网站 | 欧美 日韩 国产 在线观看 | 六月丁香久久 | 毛片无码免费无码播放 | 色插综合 | 91插插插插 | 欧美疯狂xxxxbbbb喷潮 | 狠狠躁夜夜躁人人爽天天高潮 | 五月婷婷在线观看 | 久久93| 国产后门精品视频 | 免费淫片| 天天干天天爽天天射 | 亚洲中文无码永久免费 | 久久精品亚洲国产奇米99 | 国产色片在线观看 | 国产一区久久久 | 国产999精品久久久影片官网 | 中文字幕视频免费 | 麻豆安全免费网址入口 | 樱花影院电视剧免费 | 国产精品18hdxxxⅹ在线 | 国产成人精品午夜福利在线观看 | 情欲都市成熟美妇大肉臀 | 一区二区视频免费 | 色姑娘天天操 | 67194熟妇在线直接进入 | 无遮挡边摸边吃奶边做视频 | 欧美交a欧美精品喷水 | av高清在线 | 男人的天堂在线播放 | 永久免费成人 | 欧美人与性动交α欧美片 | 欧美成人精品三级网站 | 图片区亚洲 | 国产露脸对白刺激2022 | 国产日产精品一区二区三区四区介绍 | 国产精品午夜8888 | 国产一线二线三线wwww | 日本免费网址 | 4438xx亚洲最大五色丁香 | 久久精品国产露脸对白 | 毛茸茸熟妇张开腿呻吟 | 韩国三级欧美三级国产三级 | 永久免费看片在线 | 9cao| 亚洲天堂一区在线观看 | 91久久久精品国产一区二区蜜臀 | 第一福利在线观看 | 国产欧美日韩成人 | 少妇高潮久久久久久一代女皇 | 成年人在线免费看 | 久久精热| 亚洲性无码一区二区三区 | 乌克兰少妇xxxx做受 | 国产三级av片 | 国产操操操 | 91午夜理伦私人影院 | 狠狠躁18三区二区一区张津瑜 | 亚洲日本中文字幕乱码在线电影 | 青青草国产在线视频 | 亚洲国产成人久久综合电影 | 啪啪的网站 | 爱爱爱免费视频 | 在线看片人成视频免费无遮挡 | 丁香六月婷婷开心婷婷网 | 精品欧美一区二区久久久 | 久久国产精彩视频 | 精品国产乱码久久久久久浪潮 | 777精品视频 | 热九九精品 | 精品无码黑人又粗又大又长 | 久久免费的精品国产v∧ | 欧美最黄视频 | 女同 媚药 在线播放 | 日韩精品四区 | 午夜羞羞影院男女爽爽爽 | 玖草视频在线观看 | 成人性生交免费看 | 天天干天天射综合网 | √资源天堂中文在线视频 | 扒开双腿被两个男人玩弄视频 | 中文字幕免费高清网站 | 午夜av一区二区三区 | 99久久久久久国产精品 | 亚洲成a人v欧美综合天堂麻豆 | a天堂中文在线观看 | 亚洲一二三区av | 久久亚洲精品成人无码 | 免费看美女被靠到爽的视频 | 亚洲五月婷婷 | 日本免费黄色片 | 日韩v欧美v日本v亚洲v国产v | 国产精品久久久久久福利 | 久久香蕉国产线熟妇人妻 | 精品国产品香蕉在线 | 中国美女乱淫免费看视频 | 另类 综合 日韩 欧美 亚洲 | 精品国产av一区二区三区 | 欧美www在线观看 | 久久精品久久久久观看99水蜜桃 | 粗暴肉开荤高h文农民工免费视频 | av黄色一区 | 中文国产 | 人妻无码一区二区三区 | 国产毛片乡下农村妇女bd | 先锋资源在线视频 | 一级黄色片免费 | 激情偷拍av | 久久成人免费视频 | 中文无码av一区二区三区 | 日本高清免费在线视频 | jizz中国少妇高潮出水 | 538精品视频在线播放 | 久久免费视频5 | 国产网友自拍视频 | vvvv88亚洲精品欧美精品 | 在线亚洲自拍 | 欧美日韩激情在线观看 | 色婷婷综合中文久久一本 | 欧美一级做a爰片免费视频 欧美一级做性受免费大片免费 | 伊伊亚洲综合人网777 | 丰满少妇三级全黄 | 艳妇荡女欲乱双飞两中年熟妇 | 亚洲男人第一无码av网站 | 国产精品国产三级国产av中文 | 成人精品一区日本无码网站 | 大地资源在线观看官网第三页 | 美女一区二区三区网av | 极品少妇啪啪高清免费 | 免费污视频在线观看 | 久久精品国产99国产精品 | 欧美日韩视频在线播放 | 一本本月无码- | 美国美女黄色片 | 亚洲少妇毛片 | 亚洲欧美成人在线 | 亚洲乱码国产乱码精品天美传媒 | 日韩大胆视频 | 国产怡红院在线观看 | 欧美成人午夜剧场 | 黄色美女毛片 | 天堂va欧美va亚洲va好看va | 97se亚洲国产一区二区三区 | 成人51网站 | 欧美成aⅴ人高清免费 | 少妇又色又紧又爽又高潮 | 日日操狠狠干 | xxxxx黄色片| 国产白丝jk捆绑束缚调教视频 | 成人无码在线视频网站 | 两男一前一后cao一女 | 亚洲精品成人片在线播放 | 清清草视频 | 日本人妻人人人澡人人爽 | 亚洲色播永久网址大全 | 中文字幕aⅴ人妻一区二区 性色av免费网站 | 粉嫩一区二区三区色综合 | 国产精品一国产精品 | 中国女人特级毛片 | 久久躁狠狠躁夜夜av | 中文字幕高清在线观看 | 国产一级淫片s片sss毛片s级 | 国产女人高潮大叫a毛片 | 中文字幕一区二区三区又粗 | 少妇一级淫片免费看 | 国产区视频 | 一本大道色婷婷在线 | 亚洲成人天堂 | 成人性生活大片免费看ⅰ软件 | 免费黄色网址大全 | 97精品国产97久久久久久久久久久久 | 另类图片婷婷 | 国产三级精品在线观看 | 117美女写真午夜一级 | 中文字幕日韩伦理 | 91av在线免费视频 | 午夜国产福利在线 | 九九久久精品国产 | 无码午夜福利片 | 天堂禾欧美城网站 | 在线精品视频一区二区三区 | 色诱亚洲精品久久久久久 | 夜夜躁狠狠躁日日躁2021日韩 | 亚洲欧洲精品一区二区三区不卡 | 狂野欧美激情性xxxx | 91免费高清视频 | 国产hsck在线亚洲 | 日韩一级视频在线观看 | 黄色三级在线观看 | 中文字幕乱码人妻综合二区三区 | 在线日韩一区二区 | 国产农村乱子伦精品视频 | www.狠狠| 蜜臀久久99精品久久久久久宅男 | 国产高潮流白浆喷水视频 | 欧美性成人 | 国产精品乱码人妻一区二区三区 | 午夜丰满寂寞少妇精品 | 午夜精彩视频 | 国内少妇毛片视频 | 邻居少妇张开双腿让我爽一夜 | 国产又黄视频 | 成人瑟瑟| 污网站在线观看免费 | 日韩深夜影院 | 欧美老熟妇xb水多毛多 | 中文字幕精 | 亚洲精品久久午夜无码一区二区 | 亚洲日韩激情无码一区 | 亚洲免费网址 | av观看网站 | 日本免费在线看 | 国产网址| 香蕉视频网页 | 波多野结衣av在线观看 | 三女同志亚洲人狂欢 | 欧美精品福利视频 | 一本一本久久aa综合精品 | 青青草原在线免费 | 国产丝袜无码一区二区三区视频 | 夜夜导航 | 午夜激情久久 | 色偷偷人人澡人人爽人人模 | 久久综合精品国产一区二区三区无码 | 一级大毛片 | 精品人妻中文字幕有码在线 | 天堂无乱码 | 亚洲精品主播一区二区三区 | 网站在线观看你懂的 | 人妻精品久久无码专区精东影业 | 国产又色又爽又黄的免费软件 | 午夜视频在线播放一三 | 亚拍精品一区二区三区探花 | 91在线中文字幕 | av大片网| 中国一级黄色影片 | 免费黄色在线播放 | 国产精品成人久久久久久久 | 久久69精品久久久久久国产越南 | 欧日韩av | 东京热无码av一区二区 | 国产精品国产三级国产专播精品人 | 欧美人与牲禽动a交精品 | 欧美女人交配视频 | 国产网红福利视频一区二区 | 91精品久久久久 | 成人网站在线进入爽爽爽 | 老少交欧美另类 | 欧美另类一区 | 日韩理论在线观看 | 国产99一区| 精品国产乱码一区二区 | 一个色在线视频 | 免费福利av| 少妇小芸h系列小说 | 国产毛片久久久久久国产毛片 | 91精品无人区卡一卡二卡三 | 激情综合激情五月 | 91最新在线 | 日韩一卡二卡三卡四卡 | 香蕉视频网页版 | 成人av手机在线观看 | 激情五月婷婷丁香 | 深夜福利国产 | 激情视频一区 | 亚洲自偷自拍熟女另类 | 久久精品中文无码资源站 | 国产欧美日韩精品专区黑人 | 国产美女永久免费无遮挡 | 一本色道久久综合亚洲精品不卡 | 色男人天堂av | 免费无码鲁丝片一区二区 | 在线观看国产精品普通话对白精品 | 国产性色的免费视频网站 | 亚洲精品国产av天美传媒 | 欧美在线观看你懂的 | 国产美女特级嫩嫩嫩bbb | 色妇av| 国产一区二区三区免费观看视频 | 99久久无色码中文字幕婷婷 | av动态| 日本特黄视频 | 少妇又色又紧又大爽又刺激 | 久久精品入口九色 | 日韩亚洲精品视频 | 亚洲国产欧美在线观看 | 91亚洲国产成人久久精品网站 | 成人手机视频在线观看 | 亚洲大尺度av | 精品人妻无码一区二区三区性 | 丁香五月缴情综合网 | 国产精品自拍亚洲 | 欧美精品亚洲精品日韩已满十八 | 欧美国产中文 | 免费看片啪啪tv | 亚洲精品一 | 欧美成人图区 | 国产精品一区二区av日韩在线 |