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

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

Java Annotation 高級應用

瀏覽:7日期:2024-06-15 10:38:10
內容: 版權聲明:本文可以自由轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)原文:http://www.matrix.org.cn/resource/article/44/44062_Java+Annotation+Apt.html關鍵字:java,annotation,apt前言:前不久在matrix上先后發表了《java annotation 入門》、《java annotation 手冊》兩篇文章,比較全面的對java annotation的語法、原理、使用三方面進行了闡述。由于《入門》中的簡單例程雖然簡單明了的說明了annotation用法,但給大家的感覺可能是意猶未見,所以在此行文《java annotation高級應用》,具體實例化解釋annotation和annotation processing tool(APT)的使用。望能對各位的有所幫助。一、摘要:《java annotation高級應用》具體實例化解釋annotation和annotation processing tool(APT)的使用。望能對各位的有所幫助。本文列舉了用于演示annotation的BRFW演示框架、演示APT的apt代碼實例,并對其進行較為深度的分析,希望大家多多提意見。二、annotation實例分析1.BRFW(Beaninfo Runtime FrameWork)定義:本人編寫的一個annotation功能演示框架。顧名思義,BRFW就是在運行時取得bean信息的框架。2.BRFW的功能:A.源代碼級annotation:在bean的源代碼中使用annotation定義bean的信息;B.運行時獲取bean數據:在運行時分析bean class中的annotation,并將當前bean class中field信息取出,功能類似xdoclet;C.運行時bean數據的xml綁定:將獲得的bean數據構造為xml文件格式展現。熟悉j2ee的朋友知道,這個功能類似jaxb。3.BRFW框架:BRFW主要包含以下幾個類:A.Persistent類:定義了用于修飾類的固有類型成員變量的annotation。B.Exportable類:定義了用于修飾Class的類型的annotation。C.ExportToXml類:核心類,用于完成BRFW的主要功能:將具有Exportable Annotation的bean對象轉換為xml格式文本。D.AddressForTest類:被A和B修飾過的用于測試目的的地址bean類。其中包含了地址定義所必需的信息:國家、省級、城市、街道、門牌等。E.AddressListForTest類:被A和B修飾過的友人通訊錄bean類。其中包含了通訊錄所必備的信息:友人姓名、年齡、電話、住址(成員為AddressForTest類型的ArrayList)、備注。需要說明的是電話這個bean成員變量是由字符串類型組成的ArrayList類型。由于朋友的住址可能不唯一,故這里的住址為由AddressForTest類型組成的ArrayList。從上面的列表中,可以發現A、B用于修飾bean類和其類成員;C主要用于取出bean類的數據并將其作xml綁定,代碼中使用了E作為測試類;E中可能包含著多個D。在了解了這個簡單框架后,我們來看一下BRFW的代碼吧!4.BRFW源代碼分析:A.Persistent類:清單1:package com.bjinfotech.practice.annotation.runtimeframework;import java.lang.annotation.*;/** * 用于修飾類的固有類型成員變量的annotation * @author cleverpig * */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface Persistent { String value() default '';}B.Exportable類:清單2:package com.bjinfotech.practice.annotation.runtimeframework;import java.lang.annotation.*;/** * 用于修飾類的類型的annotation * @author cleverpig * */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface Exportable { //名稱 String name() default ''; //描述 String description() default ''; //省略name和description后,用來保存name值 String value() default ''; }C.AddressForTest類:清單3:package com.bjinfotech.practice.annotation.runtimeframework;/** * 用于測試的地址類 * @author cleverpig * */@Exportable('address')public class AddressForTest { //國家 @Persistent private String country=null; //省級 @Persistent private String province=null; //城市 @Persistent private String city=null; //街道 @Persistent private String street=null; //門牌 @Persistent private String doorplate=null; public AddressForTest(String country,String province, String city,String street,String doorplate){ this.country=country; this.province=province; this.city=city; this.street=street; this.doorplate=doorplate; } }D.AddressListForTest類:清單4:package com.bjinfotech.practice.annotation.runtimeframework;import java.util.*;/** * 友人通訊錄 * 包含:姓名、年齡、電話、住址(多個)、備注 * @author cleverpig * */@Exportable(name='addresslist',description='address list')public class AddressListForTest { //友人姓名 @Persistent private String friendName=null; //友人年齡 @Persistent private int age=0; //友人電話 @Persistent private ArrayList telephone=null; //友人住址:家庭、單位 @Persistent private ArrayList AddressForText=null; //備注 @Persistent private String note=null; public AddressListForTest(String name,int age, ArrayList telephoneList, ArrayList addressList, String note){ this.friendName=name; this.age=age; this.telephone=new ArrayList(telephoneList); this.AddressForText=new ArrayList(addressList); this.note=note; }}E.ExportToXml類:清單5:package com.bjinfotech.practice.annotation.runtimeframework;import java.lang.reflect.Field;import java.util.Collection;import java.util.Iterator;import java.util.Map;import java.util.ArrayList;/** * 將具有Exportable Annotation的對象轉換為xml格式文本 * @author cleverpig * */public class ExportToXml { /** * 返回對象的成員變量的值(字符串類型) * @param field 對象的成員變量 * @param fieldTypeClass 對象的類型 * @param obj 對象 * @return 對象的成員變量的值(字符串類型) */ private String getFieldValue(Field field,Class fieldTypeClass,Object obj){ String value=null;try{ if (fieldTypeClass==String.class){value=(String)field.get(obj); } else if (fieldTypeClass==int.class){value=Integer.toString(field.getInt(obj)); } else if (fieldTypeClass==long.class){value=Long.toString(field.getLong(obj)); } else if (fieldTypeClass==short.class){value=Short.toString(field.getShort(obj)); } else if (fieldTypeClass==float.class){value=Float.toString(field.getFloat(obj)); } else if (fieldTypeClass==double.class){value=Double.toString(field.getDouble(obj)); } else if (fieldTypeClass==byte.class){value=Byte.toString(field.getByte(obj)); } else if (fieldTypeClass==char.class){value=Character.toString(field.getChar(obj)); } else if (fieldTypeClass==boolean.class){value=Boolean.toString(field.getBoolean(obj)); } } catch(Exception ex){ ex.printStackTrace(); value=null; } return value; } /** * 輸出對象的字段,當對象的字段為Collection或者Map類型時,要調用exportObject方法繼續處理 * @param obj 被處理的對象 * @throws Exception */ public void exportFields(Object obj) throws Exception{ Exportable exportable=obj.getClass().getAnnotation(Exportable.class); if (exportable!=null){ if (exportable.value().length()>0){//System.out.println('Class annotation Name:'+exportable.value()); } else{//System.out.println('Class annotation Name:'+exportable.name()); } } else{// System.out.println(obj.getClass()+'類不是使用Exportable標注過的'); }//取出對象的成員變量 Field[] fields=obj.getClass().getDeclaredFields();for(Field field:fields){ //獲得成員變量的標注 Persistent fieldAnnotation=field.getAnnotation(Persistent.class); if (fieldAnnotation==null){continue; } //重要:避免java虛擬機檢查對私有成員的訪問權限 field.setAccessible(true); Class typeClass=field.getType(); String name=field.getName(); String value=getFieldValue(field,typeClass,obj); //如果獲得成員變量的值,則輸出 if (value!=null){System.out.println(getIndent()+'n' +getIndent()+'t'+value+'n'+getIndent()+''); } //處理成員變量中類型為Collection或Map else if ((field.get(obj) instanceof Collection)||(field.get(obj) instanceof Map)){exportObject(field.get(obj)); } else{exportObject(field.get(obj)); } } } //縮進深度 int levelDepth=0; //防止循環引用的檢查者,循環引用現象如:a包含b,而b又包含a Collection cyclicChecker=new ArrayList(); /** * 返回縮進字符串 * @return */ private String getIndent(){ String s=''; for(int i=0;i0){elementName=exportable.value();}else{elementName=exportable.name();} } //未被修飾或者Exportable Annotation的值為空字符串, //則使用類名作為輸出xml的元素name if (exportable==null||elementName.length()==0){elementName=obj.getClass().getSimpleName(); } //輸出xml元素頭 System.out.println(getIndent()+''); levelDepth++; //如果沒有被修飾,則直接輸出其toString()作為元素值 if (exportable==null){System.out.println(getIndent()+obj.toString()); } //否則將對象的成員變量導出為xml else{exportFields(obj); } levelDepth--; //輸出xml元素結尾 System.out.println(getIndent()+''); } cyclicChecker.remove(obj); } public static void main(String[] argv){ try{ AddressForTest ad=new AddressForTest('China','Beijing','Beijing','winnerStreet','10'); ExportToXml test=new ExportToXml(); ArrayList telephoneList=new ArrayList(); telephoneList.add('66608888'); telephoneList.add('66608889'); ArrayList adList=new ArrayList(); adList.add(ad); AddressListForTest adl=new AddressListForTest('coolBoy',18,telephoneList,adList,'some words'); test.exportObject(adl); } catch(Exception ex){ ex.printStackTrace(); } }}在ExportToXml類之前的類比較簡單,這里必須說明一下ExportToXml類:此類的核心函數是exportObject和exportFields方法,前者輸出對象的xml信息,后者輸出對象成員變量的信息。由于對象類型和成員類型的多樣性,所以采取了以下的邏輯:在exportObject方法中,當對象類型為Collection和Map類型時,則需要遞歸調用exportObject進行處理;而如果對象類型不是Collection和Map類型的話,將判斷對象類是否被Exportable annotation修飾過:如果沒有被修飾,則直接輸出對象.toString()作為xml綁定結果的一部分;如果被修飾過,則需要調用exportFields方法對對象的成員變量進行xml綁定。在exportFields方法中,首先取出對象的所有成員,然后獲得被Persisitent annotation修飾的成員。在其后的一句:field.setAccessible(true)是很重要的,因為bean類定義中的成員訪問修飾都是private,所以為了避免java虛擬機檢查對私有成員的訪問權限,加上這一句是必需的。接著后面的語句便是輸出成員值這樣的xml結構。像在exportObject方法中一般,仍然需要判斷成員類型是否為Collection和Map類型,如果為上述兩種類型之一,則要在exportFields中再次調用exportObject來處理這個成員。在main方法中,本人編寫了一段演示代碼:建立了一個由單個友人地址類(AddressForTest)組成的ArrayList作為通訊錄類(AddressForTest)的成員的通訊錄對象,并且輸出這個對象的xml綁定,運行結果如下:清單6: coolBoy186660888866608889 China Beijing Beijing winnerStreet 10 some words 三、APT實例分析:1.何謂APT?根據sun官方的解釋,APT(annotation processing tool)是一個命令行工具,它對源代碼文件進行檢測找出其中的annotation后,使用annotation processors來處理annotation。而annotation processors使用了一套反射API并具備對JSR175規范的支持。annotation processors處理annotation的基本過程如下:首先,APT運行annotation processors根據提供的源文件中的annotation生成源代碼文件和其它的文件(文件具體內容由annotation processors的編寫者決定),接著APT將生成的源代碼文件和提供的源文件進行編譯生成類文件。簡單的和前面所講的annotation實例BRFW相比,APT就像一個在編譯時處理annotation的javac。而且從sun開發者的blog中看到,java1.6 beta版中已將APT的功能寫入到了javac中,這樣只要執行帶有特定參數的javac就能達到APT的功能。2.為何使用APT?使用APT主要目的是簡化開發者的工作量,因為APT可以在編譯程序源代碼的同時,生成一些附屬文件(比如源文件、類文件、程序發布描述文字等),這些附屬文件的內容也都是與源代碼相關的。換句話說,使用APT就是代替了傳統的對代碼信息和附屬文件的維護工作。使用過hibernate或者beehive等軟件的朋友可能深有體會。APT可以在編譯生成代碼類的同時將相關的文件寫好,比如在使用beehive時,在代碼中使用annotation聲明了許多struct要用到的配置信息,而在編譯后,這些信息會被APT以struct配置文件的方式存放。3.如何定義processor?A.APT工作過程:從整個過程來講,首先APT檢測在源代碼文件中哪些annotation存在。然后APT將查找我們編寫的annotation processor factories類,并且要求factories類提供處理源文件中所涉及的annotation的annotation processor。接下來,一個合適的annotation processors將被執行,如果在processors生成源代碼文件時,該文件中含有annotation,則APT將重復上面的過程直到沒有新文件生成。B.編寫annotation processors:編寫一個annotation processors需要使用java1.5 lib目錄中的tools.jar提供的以下4個包:com.sun.mirror.apt: 和APT交互的接口;com.sun.mirror.declaration: 用于模式化類成員、類方法、類聲明的接口;com.sun.mirror.type: 用于模式化源代碼中類型的接口; com.sun.mirror.util: 提供了用于處理類型和聲明的一些工具。 每個processor實現了在com.sun.mirror.apt包中的AnnotationProcessor接口,這個接口有一個名為“process的方法,該方法是在APT調用processor時將被用到的。一個processor可以處理一種或者多種annotation類型。一個processor實例被其相應的工廠返回,此工廠為AnnotationProcessorFactory接口的實現。APT將調用工廠類的getProcessorFor方法來獲得processor。在調用過程中,APT將提供給工廠類一個AnnotationProcessorEnvironment 類型的processor環境類對象,在這個環境對象中,processor將找到其執行所需要的每件東西,包括對所操作的程序結構的參考,與APT通訊并合作一同完成新文件的建立和警告/錯誤信息的傳輸。提供工廠類有兩個方式:通過APT的“-factory命令行參數提供,或者讓工廠類在APT的發現過程中被自動定位(關于發現過程詳細介紹請看http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html)。前者對于一個已知的factory來講是一種主動而又簡單的方式;而后者則是需要在jar文件的META-INF/services目錄中提供一個特定的發現路徑:在包含factory類的jar文件中作以下的操作:在META-INF/services目錄中建立一個名為com.sun.mirror.apt.AnnotationProcessorFactory 的UTF-8編碼文件,在文件中寫入所有要使用到的factory類全名,每個類為一個單獨行。4.一個簡單的APT實例分析:A.實例構成:Review類:定義Review Annotation;ReviewProcessorFactory類:生成ReviewProcessor的工廠類;ReviewProcessor類:定義處理Review annotation的Processor;ReviewDeclarationVisitor類:定義Review annotation聲明訪問者,ReviewProcessor將要使用之對Class進行訪問。runapt.bat:定義了使用自定義的ReviewProcessor對Review類源代碼文件進行處理的APT命令行。B.Review類:清單7:package com.bjinfotech.practice.annotation.apt;/** * 定義Review Annotation * @author cleverpig * */public @interface Review { public static enum TypeEnum{EXCELLENT,NICE,NORMAL,BAD}; TypeEnum type(); String name() default 'Review';}C.ReviewProcessorFactory類:清單8:package com.bjinfotech.practice.annotation.apt;import java.util.Collection;import java.util.Set;import java.util.Arrays;import com.sun.mirror.apt.*;import com.sun.mirror.declaration.AnnotationTypeDeclaration;import com.sun.mirror.apt.AnnotationProcessorEnvironment;//請注意為了方便,使用了靜態importimport static java.util.Collections.unmodifiableCollection;import static java.util.Collections.emptySet;/** * 生成ReviewProcessor的工廠類 * @author cleverpig * */public class ReviewProcessorFactory implements AnnotationProcessorFactory{ /** * 獲得針對某個(些)類型聲明定義的Processor * @param atds 類型聲明集合 * @param env processor環境 */ public AnnotationProcessor getProcessorFor( Set atds, AnnotationProcessorEnvironment env){ return new ReviewProcessor(env); } /** * 定義processor所支持的annotation類型 * @return processor所支持的annotation類型的集合 */ public Collection supportedAnnotationTypes(){ //“*表示支持所有的annotation類型 //當然也可以修改為“foo.bar.*、“foo.bar.Baz,來對所支持的類型進行修飾 return unmodifiableCollection(Arrays.asList('*')); } /** * 定義processor支持的選項 * @return processor支持選項的集合 */ public Collection supportedOptions(){ //返回空集合 return emptySet(); } public static void main(String[] argv){ System.out.println('ok'); }}D.ReviewProcessor類:清單9:package com.bjinfotech.practice.annotation.apt;import com.sun.mirror.apt.AnnotationProcessor;import com.sun.mirror.apt.AnnotationProcessorEnvironment;import com.sun.mirror.declaration.TypeDeclaration;import com.sun.mirror.util.DeclarationVisitors;import com.sun.mirror.util.DeclarationVisitor;/** * 定義Review annotation的Processor * @author cleverpig * */public class ReviewProcessor implements AnnotationProcessor{ //Processor所工作的環境 AnnotationProcessorEnvironment env=null; /** * 構造方法 * @param env 傳入processor環境 */ public ReviewProcessor(AnnotationProcessorEnvironment env){ this.env=env; } /** * 處理方法:查詢processor環境中的類型聲明, */ public void process(){ //查詢processor環境中的類型聲明 for(TypeDeclaration type:env.getSpecifiedTypeDeclarations()){ //返回對類進行掃描、訪問其聲明時使用的DeclarationVisitor, //傳入參數:new ReviewDeclarationVisitor(),為掃描開始前進行的對類聲明的處理 // DeclarationVisitors.NO_OP,表示在掃描完成時進行的對類聲明不做任何處理 DeclarationVisitor visitor=DeclarationVisitors.getDeclarationScanner(new ReviewDeclarationVisitor(),DeclarationVisitors.NO_OP); //應用DeclarationVisitor到類型 type.accept(visitor); } }}E.ReviewDeclarationVisitor類:清單10:package com.bjinfotech.practice.annotation.apt;import com.sun.mirror.util.*;import com.sun.mirror.declaration.*;/** * 定義Review annotation聲明訪問者 * @author cleverpig * */public class ReviewDeclarationVisitor extends SimpleDeclarationVisitor{ /** * 定義訪問類聲明的方法:打印類聲明的全名 * @param cd 類聲明對象 */ public void visitClassDeclaration(ClassDeclaration cd){ System.out.println('獲取Class聲明:'+cd.getQualifiedName()); } public void visitAnnotationTypeDeclaration(AnnotationTypeDeclaration atd){ System.out.println('獲取Annotation類型聲明:'+atd.getSimpleName()); } public void visitAnnotationTypeElementDeclaration(AnnotationTypeElementDeclaration aed){ System.out.println('獲取Annotation類型元素聲明:'+aed.getSimpleName()); }}F.runapt.bat文件內容如下:清單11:E:rem 項目根目錄set PROJECT_ROOT=E:eclipse3.1RC3workspacetigerFeaturePracticerem 包目錄路徑set PACKAGEPATH=combjinfotechpracticeannotationaptrem 運行根路徑set RUN_ROOT=%PROJECT_ROOT%buildrem 源文件所在目錄路徑set SRC_ROOT=%PROJECT_ROOT%testrem 設置Classpathset CLASSPATH=.;%JAVA_HOME%;%JAVA_HOME%/lib/tools.jar;%RUN_ROOT%cd %SRC_ROOT%%PACKAGEPATH%apt -nocompile -factory com.bjinfotech.practice.annotation.apt.ReviewProcessorFactory ./*.java四、參考資源:http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html作者的Blog:http://blog.matrix.org.cn/page/cleverpig五、源代碼下載:Download File Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 版權聲明:本文可以自由轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)原文:http://www.matrix.org.cn/resource/article/44/
標簽: Java
相關文章:
主站蜘蛛池模板: 男女又爽又黄 | 极品尤物magnet | 最新av中文字幕 | 一本大道一区二区 | 奇米视频888战线精品播放 | 美女少妇翘臀啪啪呻吟网站 | 朝桐光av在线 | 五月六月婷婷 | 伊人久久大香线蕉综合75 | 日韩黄色片免费看 | 国产欧美日韩综合精品一区二区 | 午夜精品偷拍 | 性一交一乱一交一精一品 | 欧美一区二 | 国产成人中文字幕 | 成人在线视频网址 | 动漫女女吸乳舌吻羞羞 | 国产网红主播无码精品 | b站永久免费看片大全 | 天堂网www在线资源中文 | 欧美丰满熟妇xxxx | 一本加勒比hezyo黑人 | 久艹在线观看视频 | 99福利视频| va在线视频| 日韩精品久久一区 | 国产精品爽爽 | 射区导航 | 国产精品久久久久久模特 | y111111少妇蜜桃视频 | 中文字幕在线观看网址 | 欧美一级视频免费观看 | 成人av小说 | 深夜影院深a | 国产黄大片在线观看 | 精品黄色av | 啪啪短视频 | 国产av一区二区三区 | 浪潮av激情高潮国产精品 | 亚洲看片lutube在线入口 | 日本视频高清一道一区 | 91亚洲国产精品 | 中文日韩字幕 | 99久久99久久免费精品蜜桃 | 亚洲中文字幕无码爆乳av | 黄色一区二区三区 | 又色又污又爽又黄的网站 | 沈阳熟女露脸对白视频 | 97毛片| 国产精品无码专区在线播放 | 波多野结衣先锋影音 | 丰满少妇在线观看网站 | 午夜三级影院 | 亚洲日韩国产一区二区三区 | 国产实拍会所女技师在线观看 | 在线不卡中文字幕 | 手机在线中文字幕 | 日本一区二区三区精品 | 久久久久久久久久影视 | 欧美在线免费看 | 精品国产制服丝袜高跟 | 亚洲精品欧洲 | 日本欧美色十大禁片毛片 | 欧美激情国产日韩精品一区18 | 国产少妇露脸精品自啪网站 | 久久五月综合 | 日本艳妓bbw高潮一19 | 国产盗摄一区二区 | 国产成人三级在线播放 | 天天在线观看 | 中文在线а天堂中文在线新版 | 夜夜嗨一区二区三区 | 黄网站在线播放 | 天天射天天干天天操 | 激情文学欧美 | 久久久欧美国产精品人妻噜噜 | 亚洲小少妇 | 久久久久国产综合av天堂 | 中文字幕乱码日本亚洲一区二区 | 操操操视频 | 国产精品露脸高清86网站888 | 欧美专区第一页 | 日韩资源网| 精品无码av一区二区三区不卡 | 日韩三级黄色 | 一色桃子656中文字幕 | 国产资源免费 | 国产精品美女久久久网av | 一区二区不卡免费视频 | 成人av一区 | 欧美性视频在线播放 | 久久久久久久久久久99 | 在线中文字幕亚洲 | 日韩大片在线免费观看 | 少妇一区二区三区四区 | 国产激情91久久精品导航 | 另类欧美日韩 | 精品欧美一区二区三区在线观看 | 深夜视频在线免费观看 | 国产精品区一区二区三 | 亚洲一区二区三区国产好的精华液 | 午夜美女裸体福利视频 | 99国产精品无码 | 国产精品无码av在线播放 | 欧美女人交配视频 | 一区二区在线免费视频 | 日韩精品免费在线观看 | 蜜臀久久精品久久久用户群体 | 国产天美传媒性色av | 精品国产污污免费网站 | 国产成a人无v码亚洲福利 | 青娱乐精品视频 | 日本公与丰满熄 | 91成人网在线播放 | 国产香蕉精品视频 | 国产视频在线观看网站 | 凹凸精品熟女在线观看 | 欧美另类变人与禽xxxxx | 亚洲色图36p | 国产成人精品毛片 | 亚洲成人伊人 | 免费无遮挡无码视频网站 | 无限看片在线版免费视频大全 | 中文字幕第23页在线 | 狠狠干狠狠艹 | 欧美一区二区三区 | 成人影片麻豆国产影片免费观看 | 成人免费看片98 | 久久久久人妻一区精品性色av | 亚洲欧美日韩视频一区 | 午夜影片 | 黄色一级片av | 综合网中文字幕 | 91黄色小视频 | 欧美日本中文字幕 | 伊人久久中文字幕 | 国产女人高潮合集特写 | 亚洲91在线 | 成人久久久精品国产乱码一区二区 | 97人人澡人人爽91综合色 | 91干| 91丨九色丨丰满人妖 | 大乳奶水成人吃91 | 日韩精品一区二区在线播放 | 在线观看污视频网站 | 日本极品丰满ⅹxxxhd | 五月天社区 | 日韩一区二区视频在线 | 销魂美女一区二区 | 国产熟妇久久777777 | 日韩a无v码在线播放免费 | 日本一区二区三区免费播放 | 国产成人综合久久 | 麻豆入口| 好男人蜜桃av久久久久久蜜桃 | 免费欧美一级视频 | 久久国产欧美日韩精品 | 在线观看午夜 | 亚洲国产黄色片 | 另类 综合 日韩 欧美 亚洲 | 国产成人精品久久 | 尹人色 | 国产a视频精品免费观看 | 国内精品久久久久精免费 | 女人下边被添全过视频 | 国产丝袜在线 | 18成禁人视频免费 | 91久久精品一区二区三区 | 99久久一区 | 亚洲一区二区三区在线播放 | 成人久久国产 | 性欢交69国产精品 | 久久精品欧美一区二区三区麻豆 | 五月天六月色 | 99久久久久久久 | 国产播放隔着超薄丝袜进入 | 久久久久久久久久免费 | 99精品视频在线导航 | 黑人做爰xxxⅹ性欧美有限公司 | 女人裸体性做爰23 | 又色又爽又黄的视频软件app | 精品视频无码一区二区三区 | 三上悠亚ssⅰn939无码播放 | 97超级碰碰碰 | 亚洲一区精品二人人爽久久 | 欧美日韩黄色大片 | 亚洲人成网站999久久久综合 | 日本少妇喂奶 | 美女视频黄免费 | av动漫在线免费观看 | 婷婷久久国产对白刺激五月99 | 成人综合激情 | jizz亚洲女人高潮大叫 | 国产精品免费久久久 | 一二三精品 | 亚洲国产精品国自产拍久久 | 欧美一级二级在线观看 | 男人爱看的网站 | 国产中文网 | 亚洲欧美综合网 | 精品无码久久久久久久久久 | 日韩中文字幕高清 | 97超碰人人干| 东方成人av | 一区二区三区久久久 | 999久久久无码国产精品 | 国产一区二区三区免费播放 | 美女网站全黄 | 午夜精品久久久久久久99 | 久久综合给合久久狠狠狠97色69 | 男人的又粗又长又硬 | 国产内射在线激情一区 | 成人国产综合 | wwwav小四郎com| 色综合色综合网色综合 | 中文字幕一区二区三区日韩精品 | 亚洲精品欧美综合二区 | 激情午夜网 | 欧洲av无码放荡人妇网站 | 国产suv精品一区二区69 | 久草福利资源站 | 欧美性啪啪 | 欧美一区二区影院 | 成年人91视频 | 与黑人高h系列辣文 | 青娱乐精品视频 | av网址有哪些 | 国产综合图区 | 乱码午夜-极品国产内射 | 午夜夜伦鲁鲁片六度影院 | 夜操操| 出轨人妻毛片一级 | 2021狠狠天天天 | 亚洲精品在线观看网站 | 亚洲欧美日韩久久一区二区 | 国产真实偷乱视频 | 久久综合给合综合久久 | 免费视频www在线观看网站 | 亚洲综合免费视频 | 成人福利视频在 | 男女艹逼网站 | 日日涩 | 黄色片大全 | 巨肉高h文从头做到尾肉短文 | 国产又粗又猛又黄又爽无遮挡 | 夜夜激情网 | 少妇毛片一区二区三区免费视频 | 国产午夜免费福利 | 香蕉日日| 欧美成人xxxxx | 视频一区国产 | 噼里啪啦国语影视 | 91精品播放 | 和三个男人4p爽爆了 | 婷婷精品国产欧美精品亚洲人人爽 | 国产91精品ai换脸 | 成年男人裸j网站 | aⅴ在线视频男人的天堂 | 手机av不卡 | 免费看国产黄色 | 91黄色免费看 | 欧美极品jizzhd欧美爆 | 伊人久久中文字幕 | 成人狠狠色综合 | 国产jjizz女人多水喷水 | 午夜88| 97久久精品人人 | 顶级少妇做爰视频在线观看 | 欧美69精品久久久久久不卡 | 日韩视频中文字幕在线观看 | 99蜜桃臀久久久欧美精品网站 | 91社区在线播放 | 午夜精品三级久久久有码 | 日本a级片一区二区 | xxxx69视频| 波多野结衣二区 | 久久久久久久久久久久网站 | 欧美成人精品a∨在线观看 香蕉av福利精品导航 | 婷婷俺也去俺也去官网 | 日本一卡二卡四卡无卡乱码视频免费 | 国产乱人伦精品一区二区 | 999国内精品永久免费视频 | 久久久99精品免费观看乱色 | 中文字幕在线观看一区二区三区 | jizzjizzjizz亚洲女 | 男人全程不遮挡撒尿视频 | 白晶晶果冻传媒国产今日推荐 | 日本特黄特色大片免费视频老年人 | 少妇人妻无码专区视频 | 亚洲高清在线看 | 欧美一级黄色大片 | 午夜精品影院 | 国产va免费精品观看精品 | 九九热这里有精品 | 天天干天天玩 | 野花社区www视频最新资源 | 一级性感毛片 | 黄色18网站 | 中文字幕一区二区三区在线乱码 | 亚洲中文字幕久在线 | 亚洲黄色录像 | 美女免费网站在线观看 | 亚洲成a人片77777kkkk | 夜色www国产精品资源站 | 亚洲精品久久久久中文字幕二区 | 久久久久北条麻妃免费看 | 日韩精品极品视频在线 | 综合色在线视频 | 少妇视频一区二区三区 | 国产变态口味重另类 | 亚洲男人天堂网址 | 蜜桔视频成人免费观看 | 国产日韩免费 | 天天摸天天干 | 婷婷中文字幕 | 成熟的女同志hd | 91麻豆精品国产午夜天堂 | 国产精品熟妇一区二区三区四区 | 91手机在线观看 | 久久精品无码免费不卡 | 天天躁日日躁狠狠躁欧美老妇小说 | 国产熟睡乱子伦视频 | 一级裸体视频 | 在线观看国产一区二区 | 日韩国产精品久久久久久亚洲 | av午夜久久蜜桃传媒软件 | 欧美另类69xxxx | 一区二区日韩 | 国产一级理论片 | 亚洲xxxx做受欧美 | 国产三区二区 | 欧美人与禽猛交乱配 | 国产后入清纯学生妹 | 丝袜 亚洲 另类 欧美 重口 | 日韩美女啪啪 | 综合视频| 玩弄丰满少妇人妻视频 | 亚洲综合无码无在线观看 | 色www视频永久免费 国产欧美日韩专区发布 | 丰满诱人的人妻3 | 少妇乱子伦在线播放 | 亚洲天堂五月天 | 国产精品毛片一区二区 | www.国产在线播放 | 亚洲精品黄 | 亚洲特级黄色片 | 久久久黄色片 | 中文人妻av久久人妻18 | 少妇放荡的呻吟干柴烈火动漫 | 亚洲精品国产精品国自产网站 | 伊伊亚洲综合人网777 | 成人av中文解说水果派 | 美国做爰xxxⅹ性视频 | 国产中文区4幕区2022 | fc2成人免费人成在线观看播放 | 国产无套粉嫩白浆内谢 | 亚洲国产精品日韩av不卡在线 | 强行撕衣强行糟蹋三级韩国 | 国产精品自在在线午夜出白浆 | 青青草精品视频 | 伊人情人综合 | 久久久久久高潮国产精品视 | 久久久精品一区aaa片 | 欧美日韩精品中文字幕 | 欧美日韩国产在线一区 | 欧美国产精品一区 | 国产亚洲99天堂一区 | 精品人妻无码区二区三区 | 亚洲深夜av | 深夜激情视频 | 99这里只有 | 少妇15p| 激情综合激情五月 | 超碰在线公开 | 校园春色av | 日韩乱码人妻无码中文字幕 | 国产精品无码久久久久久久久久 | 国产丰满天美videossex | 国产又粗又深又猛又爽又在线观看 | 亚洲一区二区三区在线看 | 国产精品久久久久久久一区探花 | 国产在热线精品av | 嫩草影院wwwnyz五月天 | 午夜美女网站 | 欧美高大丰满少妇xxxx | 髙清国产性猛交xxxand | 久久日本三级香港三级456 | 女同久久另类99精品国产 | 久久99影视 | 久久精品国产av一区二区三区 | 高清国产午夜精品久久久久久 | 福利二区视频 | 午夜激情久久 | 看全色黄大色黄大片大学生 | 成人羞羞网站入口免费 | 五月天激情国产综合婷婷婷 | 三上悠亚日韩精品二区 | wwwav在线com | 99riav3国产精品视频 | 日本一区二区不卡视频 | 欣赏asian国模裸体pics | 少妇洁白178在线播放 | 国产午夜在线观看 | 日本少妇高潮喷水视频 | 日韩在线免费视频观看 | 亚洲欧美日韩一区二区 | 国产精品成人无码久久久 | 强奷乱码中文字幕熟女一 | 成人中文字幕+乱码+中文字幕 | 日日鲁夜夜视频热线播放 | 亚洲狠狠爱| a男人天堂 | 中文字幕488页在线 中文字幕58页 | 在线观看av不卡 | 色婷网| 成人免费淫片 | 日本毛片在线看 | 少妇高潮av久久久久久 | 欧美h在线观看 | 少妇人妻偷人精品无码视频 | 中文字幕日韩久久 | 无码人妻av一区二区三区波多野 | 自拍色图 | 国产精品乱码一区二区三区视频 | 国内自拍99 | 丰满少妇高潮惨叫久久久一 | 国产在线高清理伦片a | 四虎免费视频 | 人人爽久久涩噜噜噜av | 美女黄色片网站 | 超碰人人国产 | 爱情岛论坛亚洲品质自拍网址大全 | av影音先锋最大资源网 | 2012中文字幕在线视频 | 99久久久国产精品免费消防器 | 久久99精品久久久久久久青青日本 | 免费看成年人视频 | 国产成人精品亚洲一区 | 勾搭足浴女技师国产在线 | 国产又粗又猛又爽又黄的三级视频 | 日本久久久久久久久久久 | 五月激情六月婷婷 | 在线观看免费日韩av | 亚洲va中文字幕无码毛片 | 中文字幕丰满乱孑伦无码专区 | 天干天干天啪啪夜爽爽av软件 | 欧美三级在线播放 | 日韩精品一级 | 国产a精品 | 无码中文字幕在线播放2 | 国产一区亚洲 | 中文字幕一级 | 日韩wwww| 美女激情av | 久久久久成人网站 | 国产亚洲精品久久久久久牛牛 | 欧美福利视频在线 | 日本aaaa大片免费观看入口 | 黄色三级情侣片 | 日日噜噜噜夜夜爽爽狠狠视频 | 在线看无码的免费网站 | 国产精品18久久久久久久久 | 麻豆一级视频 | 青青草.com| 日本捏奶吃奶的视频 | 4色av| 国产精品av在线 | 欧美美女一区 | 波多野结衣在线播放 | av在线进入| 日本阿v视频在线观看 | 午夜成年人视频 | 亚洲免费视频播放 | 日本成人一区二区 | 奇米777四色影视在线看 | 国产精品秘入口18禁麻豆免会员 | 亚洲熟妇无码一区二区三区导航 | 国产99一区 | av一区二区三区在线观看 | 精品夜夜澡人妻无码av | 老汉色老汉首页a亚洲 | 久久精品国产一区二区电影 | 国产精品久久久久久久久绿色 | 50路60路老熟妇啪啪 | 亚洲精品自产拍在线观看 | 精品www久久久久久奶水 | 成年在线视频 | 日韩亚洲一区二区三区 | 中文字幕午夜精品一区二区三区 | 狠狠躁夜夜躁人蜜臀av小说 | 秋霞视频在线 | 制服丝袜美腿一区二区 | 亚洲精品国产精品乱码视色 | 免费观看污视频 | 一级真人毛片 | 国产女人爽到高潮免费视频 | 91精品老司机久久一区啪 | 国产精品无码dvd在线观看 | 国产精品久久久久乳精品爆 | 李宗瑞91在线正在播放 | 久久免费看少妇 | 国产在线综合视频 | 国产精品国产三级国产潘金莲 | 精品一区二区三区蜜桃 | 一区二区三区不卡在线观看 | 99影视网 | 一本大道香一蕉久 | 亚洲视频欧洲视频 | 国产女主播视频 | 一区二区三区精品 | 强制中出し~大桥未久在线播放 | 天天天天色| 国产日产精品久久久久快鸭 | 黄色香蕉网 | 久久三级精品 | 久热只有精品 | 亚洲a无码综合a国产av中文 | 精品久久久久久无码中文野结衣 | 另类激情在线 | 国产精品三级一区二区 | 日韩欧美一二三 | 先锋av资源在线 | 国产黄色av片 | 日韩www在线观看 | 激情文学欧美 | 夜夜高潮久久做爽久久 | 国产网红女主播免费视频 | 美女扒开大腿让男人桶 | 国产97在线 | 免费 | 日本成人一二三区 | 天海翼中文字幕 | 久久久久激情 | 欧美一级片观看 | 一级福利视频 | 手机看片福利一区二区三区 | 亚洲色无码国产精品网站可下载 | 亚洲永久免费 | 欧美干干 | 国产一级淫片a按摩推澡按摩 | 91精品视频一区 | 五月婷婷激情综合网 | 91久久久久久久国产欧美日韩- | 中文有码在线观看 | 日本无遮挡吸乳视频 | 国产精品mm | 男人的天堂97 | 91xxx高清在线| 色偷偷人人澡人人爽人人模 | 久色网 | 超碰免费在 | 日产一二三四五六七区麻豆 | 色翁荡熄又大又硬又粗又视频图片 | 久久久成人av | 精精国产xxxx视频在线播放 | 真实国产精品视频400部 | 国产亚洲精品自拍 | 18精品爽国产白嫩精品 | 伊人久久大香线蕉综合网站 | 成人精品毛片va一区二区三区 | 调教一区二区三区 | 后入内射欧美99二区视频 | 色婷婷久久综合中文久久蜜桃av | 日本中文字幕在线 | 国产精品亚洲成在人线 | 香蕉久久一区二区三区 | 亚洲精品久久久久成人2007 | 日韩日比视频 | 屁屁国产草草影院ccyycom | 亚洲熟妇少妇任你躁在线观看无码 | 在线 国产 欧美 亚洲 天堂 | 国产女人精品视频国产灰线 | 国产女同疯狂激烈互摸 | 亚洲日日射 | 亚洲大尺度专区 | 日本a级片免费 | 在线久操 | 亚洲 小说 欧美 激情 另类 | 嫩草影院中文字幕 | 久久香视频 | 国产成人艳妇aa视频在线 | 婷婷久久综合九色综合 | 国产精品无码久久av | 色妇网| 成人黄色av | 七月丁香婷婷 | 国产性一乱一性一伧一色 | 伊甸园成人入口 | 国产成人性色生活片 | 国产精品无码一区二区桃花视频 | 情欲少妇人妻100篇 国产精品日韩av在线播放 | 欧美黑人粗大 | 1级黄色毛片 | 就要日就要操 | 欧美 偷窥 清纯 综合图区 | 欧美一级性生活视频 | www.污视频 | 在线免费观看av网站 | 婷婷毛片 | 中文字幕+乱码+中文字幕明步 | 国产品无码一区二区三区在线 | 娇小性色伦xxxxx中国av | 蜜桃久久一区二区三区 | 久久九九久久九九 | 中文字幕欧美视频 | 中文字幕色偷偷人妻久久 | 国偷自产视频一区二区久 | 91精品国产成人观看 | 人人色网 | 美女18网站 | 欧美人与性动交α欧美精品 | 中国毛片在线观看 | 成人wwe在线观看视频 | 天天摸天天爽日韩欧美大片 | 东北少妇不带套对白 | 红杏出墙记免费看 |