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

玩轉Java注釋:自動調用監聽器

原創
開發 后端
監聽器在面向對象開發中是最常用的類,用于觸發啟動和停止事件。每個Java開發者都或多或少用過監聽器,但你是否嘗試過通過Java注釋在事件總線模型上實現自動注冊并調用監聽器么?本文介紹ServiceLoader注釋的使用方法。

【51CTO精選譯文】Listener,直譯為偵聽器或監聽器,在面向對象的開發中經常需要用到。如果你需要啟動或者停止基于Java的Web系統中不同部分的代碼,那么你可以使用一個簡單的ServletContentListener來監聽容器(container)里面的啟動事件和停止事件。這個監聽器可以使用java.util.ServiceLoader去尋找這些被偵聽事件所對應的已注冊類。

這個方法不錯,但是如果添加一個編譯時間注釋處理器會不會更好呢?如果你用@Lifecycle(LifecycleEvent.STARTUP)注釋一個靜態方法,它將會在開機的時候被調用(在關機的時候被關掉)。處理器會產生類,并為了ServiceLoader而注冊它們。你也可以把同樣的機制用在任何事件總線(event-bus)模型上:在編譯的時候注冊listener,并且帶有注釋,當事件被觸發的時候總線會自動調用他們。從本質上講,你可以通過注釋實現用ServiceLoader在運行時間自動發現代碼。

實際過程中,其概念如下:

1. 你用@EventListener對方法進行注釋(可能包含一些元信息(meta-info))。

2. 注釋處理器為每個@EventListener方法生成一個EventDispatcher,包括注釋中元信息需要的過濾器。

3.  事件總線利用java.util.ServiceLoader找到EventDispatcher的實現。

當EventBus.dispatch被調用時,任何有興趣的、已經用@EventListener注釋的方法都會被調用。

本文將對事件總線創建的幾個必要步驟進行分析,從而闡明這一概念。事件總線不需要任何手動注冊就可以調用已注釋了的listener方法。我們將從Eventbus開始討論,然后是注釋處理器,***是一個用法實例。

組織你的代碼

這個例子的代碼包含兩個單獨的IDE工程

◆EventBus ——包含了事件總線以及注釋處理器

◆EventBusExample ——包含了一個使用事件總線的例子

當操作注釋處理器的時候,你應該在IDE選項中關閉"Compile on Save"(或者其他等同的選項)。這些選項可能會刪除注釋處理器所生成的類,讓你摸不著頭腦。

以下內容將會解釋這些工程中的代碼是如何工作的,而且為了便于說明還提供了一些程序片段。

注釋和事件

你需要的***個東西是一個@EventListener注釋,用來標識那些偵聽事件的方法。下面是一個EventListener注釋的例子,它只能用來注釋方法。在代碼編譯后它將被拋棄,因為所有的處理都是對源代碼進行的。

  1. @Target(ElementType.METHOD)  
  2. @Retention(RetentionPolicy.SOURCE)  
  3. public @interface EventListener {  
  4.     String name() default ".*";  
  5.     Class<?> source() default Object.class;  
  6. }  
  7.  

由于這個例子是一個事件總線模型,那么listener方法***只接受它們唯一感興趣的事件。為了便于執行這個規則,在BusEventObject類中包含了你想過濾的名字(以@EventListener注釋里面的名字為基礎)。為了讓過濾事件更加簡單,這個普通的EventObject類中還有一個附加的名字域。BusEventObject也作為一個標識,可以標識出通過EventBus分派的事件。

  1. public abstract class BusEventObject extends EventObject {  
  2.     private final String name;  
  3.     public BusEventObject(  
  4.             final Object source,  
  5.             final String name) {  
  6.         super(source);  
  7.         if(name == null || name.isEmpty()) {  
  8.             throw new IllegalArgumentException("empty or null name");  
  9.         }  
  10.         this.name = name;  
  11.     }  
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15. }  
  16.  

注釋處理器

為了開始寫注釋處理器,你首先應該熟悉javax.annotation.processing 和 javax.lang.model的包組。一般來說,你可以直接掠過執行處理器接口,進入抽象類javax.annotation.processing.AbstractProcessor。AbstractProcessor需要一些關于實現的信息,這些信息用來提供注釋。例子中的EventListenerAnnotationProcessor代碼聲明如下所示:

  1. @SupportedSourceVersion(SourceVersion.RELEASE_5)  
  2. @SupportedAnnotationTypes(EventListenerAnnotationProcessor.ANNOTATION_TYPE)  
  3. public class EventListenerAnnotationProcessor extends AbstractProcessor {  
  4.  

@SupportedSourceVersion告訴AbstractProcessor你只想要用java5或者更高版本寫的源文件;而@SupportedAnnotationTypes告訴AbstractProcessor哪個注釋是你感興趣的(EventListener.class.getName()不會作為一個注釋值起作用,因為編譯器不能計算這種表達式的值)。

  1. public static final String ANNOTATION_TYPE = "eventbus.EventListener";  
  2.  

為了簡單起見,注釋處理器被分成兩個主要的類(EventListenerAnnotationProcessor 和EventDispatcherGenerator)以及一個通用工具類(ServiceRegistration)。為了便于編譯器注釋工具執行EventListenerAnnotationProcessor,你需要用一個服務文件來注冊它(編譯器也使用ServiceLoader)。

eventbus.processor.EventListenerAnnotationProcessor

服務注冊文件(META-INF/services/javax.annotation.processing.Processor)是根據ServiceLoader一定能找到的接口來命名的。

EventListenerAnnotationProcessor.process()方法的***個行動就是找到這輪編譯中所有的@EventListener方法。

  1. final Elements elements = processingEnv.getElementUtils();  
  2. final TypeElement annotation = elements.getTypeElement(ANNOTATION_TYPE);  
  3. final Set<? extends Element> methods =  
  4.         roundEnv.getElementsAnnotatedWith(annotation);  
  5.  

Element對象很像編譯器以及注釋處理器的反射對象(reflection objects)。TypeElement就像是類,而ExecutableElement跟構造器或者方法類似。RoundEnvironment(代表本輪注釋處理)將會返回到被@EventListener 注釋的Element。

EventDispatcherGenerator

EventDispatcherGenerator是一個非常簡單的代碼生成器。你可能更喜歡用模板(比如FreeMarker 或者Velocity)來生成你的源代碼,但是這個例子中的代碼是用PrintWriter寫的。每個代表@EventListener注釋方法的ExecutableElementEvent被傳遞到DispatcherGenerator.generate,它可以給EventDispatcher寫出源代碼。

  1. for(final Element m : methods) {  
  2.     // ensure that the element is a method  
  3.     if(m.getKind() == ElementKind.METHOD) {  
  4.         final ExecutableElement method = (ExecutableElement)m;  
  5.         results.add(generator.generate(method));  
  6.     }  
  7. }  
  8.  

該EventDispatcherGenerator需要為每個方法產生一個Java源文件。一個注釋處理器用ProcessingEnvironment提供的過濾目標來創建用于編寫代碼的源文件。

  1. final JavaFileObject file = processingEnvironment.getFiler().createSourceFile(  
  2.         className, // ie: com.mydomain.example.OnMessageDispatcher  
  3.         method);     // ie: com.mydomain.example.Listener.onMessage(MessageEvent)  
  4.  

在這個例子中,給定的過濾器ExecutableElement代表了已經注釋的方法(createSourceFile中的第二個觀點)。這會告訴環境你正在生成跟那個方法相關的源代碼,雖然不是必須的,但是比較有用。然后代碼用JavaFileObject來打開一個書寫器,并開始生成源代碼。

  1. final Writer writer = file.openWriter();  
  2. final PrintWriter pw = new PrintWriter(writer);  
  3. pw.append("package ").append(packageName).println(';');  
  4.  

在@EventListener注釋中為方法指定值,從而在調用注釋方法之前產生一個if 語句,這個if語句可以過濾BusEventObjects。EventDispatcherGenerator把if 語句寫進源代碼,從而決定是否把事件對象分派到@EventListener方法中去。

  1. public final class EventBus {  
  2.     private static final EventDispatcher[] DISPATCHERS;  
  3.     static {  
  4.         final ServiceLoader<EventDispatcher> loader =  
  5.                 ServiceLoader.load(EventDispatcher.class);  
  6.         final List<EventDispatcher> list = new ArrayList<EventDispatcher>();  
  7.         for(final EventDispatcher dispatcher : loader) {  
  8.             list.add(dispatcher);  
  9.         }  
  10.         DISPATCHERS = list.toArray(new EventDispatcher[list.size()]);  
  11.     }  
  12.     private EventBus() {  
  13.     }  
  14.     public static void dispatch(final BusEventObject object) {  
  15.         if(object == null) {  
  16.             throw new IllegalArgumentException("null event object");  
  17.         }  
  18.         for(final EventDispatcher dispatcher : DISPATCHERS) {  
  19.             dispatcher.dispatch(object);  
  20.         }  
  21.     }   
  22.     public static interface EventDispatcher {  
  23.    
  24.         void dispatch(BusEventObject object);  
  25.     }  
  26. }  
  27.  

#p#

對EventDispatcher進行注冊

對于生成EventDispatcher來說,***的工作就是在一個服務文件中把它們全部列出,這樣在EventBus初始化的時候ServiceLoader能夠找得到它們。這個過程有幾個技巧。注釋處理器會給你一個列表,上面只列出了目前編譯中的方法。如果開發人員不想馬上編譯他們的所有代碼,那么處理器代碼需要跟蹤已經編譯好了的和那些正在編譯的方法。這便是ServiceRegistration類所要做的工作。

首先,你需要告訴ServiceRegistration來讀在源路徑或者類輸出目錄中現存的服務文件。接下來,你添加新編譯的EventDispatcher類,然后把新的服務文件寫到類的輸出目錄中。

  1. final AnnotationHelper annotation = new AnnotationHelper(  
  2.                 method,  
  3.                 EventListenerAnnotationProcessor.ANNOTATION_TYPE,  
  4.                 environment.getElementUtils());  
  5.    
  6. final String nameFilter = (String)annotation.getValue("name");  
  7. final TypeElement sourceFilter = (TypeElement)environment.getTypeUtils().  
  8.         asElement((TypeMirror)annotation.getValue("source"));  
  9.    
  10. pw.println("\tpublic void dispatch(eventbus.BusEventObject event) {");  
  11.    
  12. pw.print("\t\tif(event instanceof ");  
  13. pw.println(eventType.getQualifiedName());  
  14. pw.println("\t\t\t\t&& nameFilter.matcher(event.getName()).matches()");  
  15. pw.append("\t\t\t\t&& event.getSource() instanceof ").  
  16.         append(sourceFilter.getQualifiedName()).println(") {");  
  17.  

把所有的東西放在一起

EventBus工程的結果是一個簡單的JAR文件,既有編譯時間又有運行時間代碼(盡管你可以把它分解成兩個JAR文件)。現在你需要寫一個BusEventObject的子類,它可以通過EventBus被分派到listener。你還需要一個@EventListener方法,來接受你的新事件類的實例。***:你需要一個類來分派事件(從一個源文件)。

為了驗證@EventListener方法生成了一個EventDispatcher,你需要讓編譯器知道運行EventListenerAnnotationProcessor。這個過程根據IDE的不同而不同,但是驗證了JAR文件是在類路徑上或者在你工程庫里已經足夠了。在一些IDE里,你需要對注釋處理器進行手動注冊。而這個例子中,MessageEvent類將通過事件總線來分派:

  1. public class MessageEvent extends BusEventObject {  
  2.     private final String message;  
  3.     // constructor, etc.  
  4.     public String getMessage() {  
  5.         return message;  
  6.     }  
  7. }  
  8.  

你需要一個@EventListener來接受MessageEvent對象,并進行一些處理。請記住,你可以在任何類中進行這樣的操作,只要注釋處理器有機會看代碼。比如本例,代碼打開了一個帶有消息的JoptionPane:

  1. @EventListener 
  2. public static void onMessage(final MessageEvent event) {  
  3.     JOptionPane.showMessageDialog(  
  4.             null,  
  5.             event.getMessage(),  
  6.             "Message Event",  
  7.             JOptionPane.INFORMATION_MESSAGE);  
  8. }  
  9.  

這個listener MessageListener是一個包羅萬象的listener,可以接受所有通過事件總線分派過來的MessageEvent對象。

剩下唯一需要做的事情就是通過EventBus來分派MessageEvent:

  1. EventBus.dispatch(new MessageEvent(  
  2.         this,  
  3.         "message",  
  4.         "Hello World!"));  
  5.  

MessageEvent構造器接管了事件的源,事件名字,以及消息。這個事件將去向任何由@EventListener注釋的方法,并接受MessageEvent作為他們的參數。

輸出文件在哪里?

#t#當你完成編譯代碼以后,看看創建目錄。在每個帶有@EventListener方法的類文件旁邊,那里應該有*EventDispatcher Java源文件以及生成的類文件。如果那些文件不在那里,請確保你已經設置了你的創建目錄環境,以便于EventListenerAnnotationProcessor對于編譯器以及注釋處理工具是可見的(你可以回去參考"組織你的代碼"那一節)。

我希望,你會發現使用ServiceLoader注釋讓你的生活更輕松。

原文:Implement Automatic Discovery in Your Java Code with Annotations  作者:Jason Morris

責任編輯:yangsai 來源: 51CTO.com
相關推薦

2011-03-21 16:21:49

Oracle監聽口令監聽器

2009-09-27 17:46:22

Hibernate監聽

2009-07-08 17:39:23

Servlet監聽器

2011-05-16 10:14:11

Hibernate

2009-01-03 13:37:26

Oracle監聽器Oracle服務器Oracle網絡配置

2011-06-01 14:55:24

Android Service 監聽器

2009-07-06 13:48:53

Servlet監聽器

2010-04-23 18:00:31

2023-01-06 08:55:00

2010-02-22 15:06:31

WCF信道監聽器

2009-11-09 10:03:09

WCF通道監聽器

2009-11-18 18:28:27

Oracle監聽器

2012-02-03 13:27:16

2009-06-22 09:23:18

事件監聽器

2010-04-23 10:13:18

Oracle監聽

2010-08-09 11:06:01

Flex事件機制

2010-04-19 15:38:10

2020-04-20 11:09:49

過濾器監聽器 Web

2009-07-17 09:55:02

事件監聽器SWT和SwingAWT

2023-11-01 07:55:03

事件監聽器傳遞數據
點贊
收藏

51CTO技術棧公眾號

日韩av电影网址| 亚洲av无码专区在线播放中文| 久久综合九色综合久| 蜜臀av性久久久久av蜜臀妖精| 精品国产一区二区三区在线观看| 午夜影院免费版| 在线看片福利| 亚洲三级电影全部在线观看高清| 精品麻豆av| 国产精品无码专区av免费播放| 好吊日精品视频| 中文日韩在线观看| 午夜男人的天堂| 欧美综合影院| 欧美性猛交xxxx乱大交极品| 宅男av一区二区三区| 五月婷婷深深爱| 精品在线观看视频| 欧美在线观看视频| 黄页网站免费观看| 日韩欧美精品一区| 亚洲精品美女久久久| 天堂av手机在线| 欧美精品总汇| 精品毛片网大全| 操bbb操bbb| www黄在线观看| 97精品电影院| 999日本视频| 亚洲天堂网在线观看视频| 亚洲最黄网站| 欧美日产国产成人免费图片| а天堂中文在线资源| 综合综合综合综合综合网| 日韩女优电影在线观看| 热久久久久久久久| 黄色欧美视频| 在线观看欧美日本| 黄色高清无遮挡| 特黄毛片在线观看| 亚洲国产另类精品专区| 欧美一区二区三区综合| 高清免费电影在线观看| 中文字幕一区二区日韩精品绯色| 欧美性xxxx69| 免费一级毛片在线观看| 91在线视频观看| 国严精品久久久久久亚洲影视 | 亚洲国产日韩av| 中文字幕乱码免费| 好操啊在线观看免费视频| 中文字幕免费一区| 日本午夜精品一区二区三区| 欧美捆绑视频| 国产亚洲人成网站| 日韩欧美视频第二区| 精品av中文字幕在线毛片 | 日韩香蕉视频| 国产69精品久久久久9| 91视频免费在线看| 国产精品sm| 欧美精品精品精品精品免费| 久久国产精品二区| 亚洲经典三级| 欧美与黑人午夜性猛交久久久| 国产系列精品av| 亚洲在线成人| 国产精品video| 中文字幕网址在线| 狠狠久久亚洲欧美| 国产福利久久精品| 熟妇人妻一区二区三区四区| 91天堂素人约啪| 青青影院一区二区三区四区| 国产大片在线免费观看| 日韩一区在线播放| 欧美一区二区三区综合| 日本不卡1234视频| 欧美午夜精品一区二区三区| 九九久久久久久| 99久久人爽人人添人人澡| 亚洲国产小视频在线观看| 一区二区三区少妇| 国产一区二区三区站长工具| 久久精品电影一区二区| 国产精品.www| 久热精品在线| 亚洲va欧美va国产综合剧情| 国模人体一区二区| 国产亚洲精品aa| 国产大尺度在线观看| 欧美hdxxx| 色婷婷精品大视频在线蜜桃视频| 中文字幕在线综合| 精品国产导航| 中文字幕日韩精品有码视频| 久草成人在线视频| 奇米精品一区二区三区在线观看一| 成人福利在线观看| 午夜性色福利影院| 国产精品卡一卡二卡三| 欧美视频在线观看网站| 国产韩日精品| 亚洲电影免费观看高清| 青青青视频在线免费观看| 在线精品一区二区| 国产视频999| 头脑特工队2免费完整版在线观看| 中文字幕第一区二区| 成人免费性视频| 成人免费黄色| 亚洲精品视频免费| 久草视频在线资源| 日本vs亚洲vs韩国一区三区二区 | 中文字幕无码不卡免费视频| 精品久久国产一区| 尤物yw午夜国产精品视频| 久久精品国产亚洲av麻豆色欲| 青青青伊人色综合久久| 狠狠久久综合婷婷不卡| 中文字幕在线播放网址| 欧美日韩亚洲综合在线| 国产精品jizz| 亚洲国产高清视频| 亚洲xxxx18| 成年人视频在线看| 色婷婷久久久久swag精品| 白嫩情侣偷拍呻吟刺激 | 99久久精品国产精品久久| 综合操久久久| 日韩制服一区| 国产亚洲激情视频在线| 成年人免费高清视频| 国产成人8x视频一区二区| 一区二区冒白浆视频| 国产一区二区主播在线| 亚洲欧美日韩高清| 黄色大片网站在线观看| 99视频一区二区三区| 奇米777四色影视在线看| 国产一区二区三区| 久久精品国产v日韩v亚洲 | 日韩 欧美一区二区三区| 久久久久综合一区二区三区| av资源网在线播放| 亚洲成人av中文字幕| 久久精品99国产精| 国产xxx精品视频大全| 91免费版看片| 成人看片爽爽爽| 久久久亚洲成人| 懂色av蜜臀av粉嫩av分享吧| 亚洲一区二区三区四区在线| 亚洲午夜精品在线观看| 欧美激情1区2区| av一区二区三区在线观看| gogo在线观看| 欧美va亚洲va香蕉在线| 久久久久久久久97| youjizz久久| 亚洲精品无码久久久久久| 在线日韩网站| 国产精品久久久久91| www在线免费观看| 欧美日韩一区不卡| 手机在线免费看片| 成人黄色777网| 国产亚洲天堂网| sdde在线播放一区二区| 国产一区红桃视频| 欧美四级在线| 日韩av网站大全| 中文字幕码精品视频网站| 国产精品高潮久久久久无| 欧美污在线观看| 亚洲毛片视频| 日韩影视精品| 深夜福利一区| 欧美又大粗又爽又黄大片视频| 精品无人乱码| 555www色欧美视频| 欧美日韩综合在线观看| 欧美国产一区二区| 日本人妻一区二区三区| 久久中文在线| 麻豆一区二区三区在线观看| 你懂的在线观看一区二区| 日韩av免费看| 色呦呦网站在线观看| 日韩电影视频免费| 91久久久久久久久久久久| 亚洲一区二区在线观看视频| 中文人妻一区二区三区| 蜜桃视频一区二区| 少妇无码av无码专区在线观看| 国产不卡一二三区| 99re在线| 国产极品嫩模在线观看91精品| 欧美激情精品久久久久久| 精品视频三区| 精品久久久久av影院| 久久久国产免费| 夜夜嗨av一区二区三区网页 | 国产精品久久久久永久免费观看| 青娱乐国产精品视频| 日韩va欧美va亚洲va久久| 男人草女人视频| 北条麻妃国产九九九精品小说| 国产69精品久久久久9999apgf | 91中文精品字幕在线视频| 精品3atv在线视频| 欧美富婆性猛交| 一广人看www在线观看免费视频| 精品国产1区二区| 97成人在线观看| 色婷婷综合视频在线观看| 久久97人妻无码一区二区三区| 国产精品素人一区二区| 人人妻人人澡人人爽人人精品| 国产乱码精品一区二区三区五月婷 | 欧美特黄一级| 国产高潮呻吟久久久| 国产成人一区| 久久久久高清| 久久香蕉网站| 99国产精品久久久久老师| 欧美videos粗暴| 国产成人一区二区三区小说| 国产精品电影| 欧美黑人xxxx| а√资源新版在线天堂| 精品国产美女在线| 成年午夜在线| 国产亚洲精品一区二区| 欧美精品a∨在线观看不卡| 亚洲成人国产精品| 亚洲免费视频网| 欧美一级片在线| 国产美女www爽爽爽视频| 欧美日韩在线三区| 中国a一片一级一片| 色香色香欲天天天影视综合网| 天天操天天操天天操天天| 亚洲va韩国va欧美va| 日韩成人高清视频| 性做久久久久久免费观看欧美| 久久久全国免费视频| 亚洲乱码日产精品bd| 美女福利视频在线观看| 亚洲精品午夜久久久| 青青操国产视频| 一区二区日韩av| 精品少妇久久久| 亚洲成人动漫精品| 在线观看 中文字幕| 狠狠躁夜夜躁人人爽天天天天97 | 国产在线成人| 国产九色porny| 99精品国产福利在线观看免费| 2018国产在线| 久久狠狠婷婷| 中文字幕第36页| 精品在线一区二区三区| 国产精品中文久久久久久| 成人三级伦理片| 风间由美一二三区av片| 久久精品亚洲麻豆av一区二区 | 青青久久aⅴ北条麻妃| 激情开心成人网| 国产一区二区色| 亚洲精品黑牛一区二区三区| 国产在线一区二区三区欧美| 伊人久久大香线蕉综合网站| 亚洲欧洲中文| 欧美韩国一区| 久久久免费视频网站| 免播放器亚洲一区| 日本美女久久久| 97久久超碰国产精品电影| 日本人亚洲人jjzzjjz| 1024精品合集| 久久国产黄色片| 欧美人妖巨大在线| 黄色av中文字幕| 亚洲色图第一页| av电影免费在线观看| 2018中文字幕一区二区三区| 精品自拍视频| 国产视色精品亚洲一区二区| 国产精品嫩模av在线| 成人免费看片视频在线观看| 亚洲一区二区免费看| 国产女同无遮挡互慰高潮91| 99精品久久只有精品| 国产探花视频在线| 偷窥国产亚洲免费视频| 在线观看中文字幕码| 亚洲国产精品yw在线观看| 免费av网站在线观看| 性视频1819p久久| 亚洲精品无播放器在线播放| 精品日韩欧美| 欧美成人高清| 中文字幕国产免费| 91免费国产在线观看| 国内偷拍精品视频| 欧美性感一区二区三区| 秋霞网一区二区| 久久精品在线视频| 三级成人黄色影院| 国产精品乱子乱xxxx| 国产精品x453.com| 男人操女人免费| 成人手机在线视频| www.97视频| 在线观看一区二区视频| 婷婷色在线观看| 欧美寡妇偷汉性猛交| 欧美aaa级| 日本一区视频在线播放| 亚洲作爱视频| 精人妻一区二区三区| 亚洲码国产岛国毛片在线| 亚洲男人天堂网址| 亚洲欧洲日产国码av系列天堂| 成人性生交大片免费看网站| 亚洲一区二区免费| 国产精品88久久久久久| 色婷婷成人在线| 日本一区二区综合亚洲| av大片在线免费观看| 亚洲福利在线视频| 丁香花在线观看完整版电影| 51国偷自产一区二区三区的来源| 天天久久综合| 8x8x成人免费视频| 中文字幕一区二区三中文字幕| 中文字幕一区二区三区四区欧美| 精品一区二区三区三区| 男人天堂视频在线观看| 精品日本一区二区三区| 在线免费观看欧美| 三级男人添奶爽爽爽视频| 黑人欧美xxxx| 黄色片在线免费看| 国产精品久久久久久中文字| 国语产色综合| 亚洲一级免费在线观看| 国产精品久久久久精k8| 国产乱淫a∨片免费观看| 久久视频精品在线| 久久久久久久久久久久电影| 久久精品在线免费视频| 国产成人精品三级| 国产无遮挡免费视频| 亚洲国产精品久久| 在线天堂新版最新版在线8| 日本精品一区二区| 麻豆精品在线看| 国产女人18水真多毛片18精品| 日韩一区二区三| a级片免费在线观看| 久久精品国产综合精品 | 国产成人精品一区| 精品无人区麻豆乱码久久久| www.这里只有精品| 亚洲美女在线一区| 日本黄视频在线观看| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩水蜜桃| 91免费视频污| 午夜精品久久久久久久| 国产有码在线| 91久久精品国产91久久| 尹人成人综合网| 欧美日韩高清丝袜| 欧美一区二视频| 2019中文字幕在线电影免费| 日韩高清国产精品| 国产在线精品不卡| 九九热国产视频| 色爱精品视频一区| y111111国产精品久久久| 日韩毛片在线免费看| 最新国产成人在线观看| 午夜在线观看视频18| 成人性生交大片免费看视频直播 | 中国黄色片免费看| 亚洲一区二区三区在线| 国产精品四虎| 99伊人久久| 日本亚洲一区二区| 久久精品国产亚洲av无码娇色| 亚洲视频在线免费观看| 欧美三级一区| www.天天射.com| 天天综合网天天综合色| 欧美13一16娇小xxxx| 久久综合一区| 国产激情一区二区三区|