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

Java 高級特性之使用反射實現(xiàn)萬能序列化

開發(fā) 后端
很多時候我們需要將一個類的實例變成二進(jìn)制數(shù)據(jù)存儲或是通過網(wǎng)絡(luò)發(fā)送,這個過程叫序列化。

[[437080]]

很多時候我們需要將一個類的實例變成二進(jìn)制數(shù)據(jù)存儲或是通過網(wǎng)絡(luò)發(fā)送,這個過程叫序列化。如果將二進(jìn)制數(shù)據(jù)解析成位于內(nèi)存中的類實例或是相關(guān)數(shù)據(jù)結(jié)構(gòu),那叫反序列化。所有的序列化算法都遵循一定的套路,例如:

  1. class A { 
  2.  
  3. public int a = 1; 
  4.  
  5. public int b = 2; 
  6.  
  7. protected B b = new B(); 
  8.  
  9. private float c = 3.0; 
  10.  

如果要序列化類A的實例,那么通常需要將變量a,b的數(shù)值對應(yīng)的二進(jìn)制數(shù)寫入,然后獲得類B實例序列化后的二進(jìn)制數(shù)據(jù),最后將變量c的數(shù)值的二進(jìn)制數(shù)據(jù),這里可以體會到,序列化其實有一種遞歸的性質(zhì),在序列化過程中如果遇到的是基礎(chǔ)類型,那么可以直接獲取其對應(yīng)的二進(jìn)制數(shù)據(jù),如果遇到類實例,那么需要先序列化它,取得對應(yīng)二進(jìn)制數(shù)據(jù)。

而序列化過程中需要你了解對應(yīng)類的定義,但如果我們不知道要序列化的對象,例如我們看不到類A的定義,我們只拿到了A對應(yīng)的一個實例對象,那此時怎么序列化呢。這就需要用到j(luò)ava語言的反射特性,java編譯器在編譯類A時,不僅僅將它為它的各個字段分配了內(nèi)存,而且還為類A的相關(guān)信息進(jìn)行了設(shè)置和存儲,例如A里面有多少字段,字段的類型是int, float, stirng,還是特定類對象,這些信息都一并設(shè)置并存儲了起來,只要我們使用java反射提供的API就能獲得這些信息,從而就能對任意類實現(xiàn)序列化。

因此序列化的萬能套路是:

1,獲得要序列化的類實例;

2,獲得類中各個字段的屬性,類型等相關(guān)信息。

3,如果字段屬于基礎(chǔ)數(shù)據(jù),那么獲得其數(shù)值的二進(jìn)制數(shù)據(jù)。

4,如果對應(yīng)字段是一個類實例,那么先遞歸的序列化該實例

根據(jù)以上步驟,當(dāng)我們需要序列化任意一個類實例時,首先通過getClass獲得其對應(yīng)的Class類實例,然后調(diào)用getDeclaredFields()接口獲得該實例所有的字段,其中包括public,protected,private,或者調(diào)用getFields()獲得類實例聲明或繼承的公有字段。在序列化中,我們不能忘了序列化當(dāng)前類實例的父類,因此可以調(diào)用getSuperClass()來獲得當(dāng)前實例的父類,這個過程會不斷進(jìn)行直到抵達(dá)根類為止。

每個字段都會對應(yīng)一個元類叫Field,通過該類相關(guān)接口能獲得字段的值。獲取字段的數(shù)據(jù)首先需要確定字段的類型,如果是Boolean類型,那么可以調(diào)用Field類的getBoolean接口獲得數(shù)據(jù),如果是int類型,那么可以通過getInteger()接口獲得數(shù)據(jù),如果字段是類對象,那么就得遞歸的去獲得其二進(jìn)制數(shù)據(jù),如果字段是基礎(chǔ)類型,那么通過調(diào)用其getString()就能獲得其數(shù)值的字符串形式。

在獲取字段類型前,我們還需要知道字段的修飾屬性,例如是public還是private,是不是static等,這些屬性通過Field類的接口getModifier()獲得,調(diào)用它會返回一個整形值,該值在相關(guān)比特位上設(shè)置1或0來表示修飾屬性。在java語法中共有11種修飾屬性,因此有11個比特位來對應(yīng),但我們不需要分析哪個比特位設(shè)置為1來獲取字段屬性,java反射提供了一個特定類Modifier,通過getModifier返回的數(shù)值可以輸入Modifier類的isPublic, isPrivate等接口來查詢字段對應(yīng)的修飾屬性。

在序列化時,我們要忽略掉static屬性的字段,因此他們是寫死的,因此通過Modifier.isStatic(field.getModifier())所得結(jié)果就能進(jìn)行字段的static屬性判斷。總所周知,對于protected 或是private類型的字段,外部是不能直接讀取的,但是序列化必須要能讀取這類字段的值,要不然序列化就無法進(jìn)行,F(xiàn)ield類提供了setAccessible(true)來打破這個限制。

此外還需要考慮的一個因素是,如果字段是數(shù)組類型的情況。java反射提供了元類Array來應(yīng)對,假設(shè)實例對象obj是一個數(shù)組,那么Array.getLength(obj)就能獲得數(shù)組的長度,Array.get(obj, i)就能獲得第i個元素對象。

最后我們需要考慮序列化后的文件格式,我們使用xml格式來存儲序列化的結(jié)果,例如在上面例子中,字段a在序列化后對應(yīng)為”\1\“,具體的情況我們在后續(xù)代碼中慢慢來觀察。

首先我們使用IntelliJ 創(chuàng)建一個maven項目,由于我們需要將數(shù)據(jù)序列化成XML文件,因此需要使用JDOM接口,于是在pom.xml中添加如下依賴:

  1. <!-- https://mvnrepository.com/artifact/org.jdom/jdom --> 
  2.       <dependency> 
  3.           <groupId>org.jdom</groupId> 
  4.           <artifactId>jdom</artifactId> 
  5.           <version>2.0.2</version> 
  6.       </dependency> 

 

然后點擊一下Maven命令面板的下載按鈕下載jdom包。然后我們創(chuàng)建一個實現(xiàn)文件叫ReflectionSerilization,然后先完成一些骨架基礎(chǔ):

  1. import org.jdom2.Document; 
  2. import org.jdom2.Element; 
  3. import org.jdom2.output.XMLOutputter; 
  4. import java.lang.reflect.*; 
  5. import java.util.IdentityHashMap; 
  6. import java.util.HashMap; 
  7. import java.util.List; 
  8. import java.util.Properties; 
  9. import java.util.Map; 
  10.  
  11. public class ReflectionSerialization { 
  12.     public  Document doSerilizeObject(Object objectToSerilized) throws Exception{ 
  13.         return recursiveSerilizeObject(objectToSerilized, new Document(new Element("serialized")), 
  14.                 new IdentityHashMap()); 
  15.     } 
  16.  
  17.     private  Document recursiveSerilizeObject(Object objToSerilized, Document target, Map table) throws Exception{ 
  18.         String id = Integer.toString(table.size()); //為當(dāng)前序列化的對象設(shè)置id標(biāo)號 
  19.         table.put(objToSerilized, id); 
  20.         Class objClass = objToSerilized.getClass(); 
  21.  
  22.         Element elem = new Element("object"); 
  23.         elem.setAttribute("class", objClass.getName()); 
  24.         elem.setAttribute("id", id); 
  25.         target.getRootElement().addContent(elem); 
  26.         /* 
  27.          判斷當(dāng)前要序列化的對象是否是數(shù)組類型,如果不是,那么先遍歷該對象所有字段,然后遞歸的序列化對應(yīng)字段,因為字段有可能是類對象, 
  28.          如果是數(shù)組類型,那么遍歷其中每個元素,然后針對每個元素進(jìn)行序列化 
  29.          */ 
  30.         if (objClass.isArray()) { 
  31.             //TODO 
  32.         } else { 
  33.             //TODO 
  34.         } 
  35.     } 
  36.     public static void main(String[] args) { 
  37.     } 

接下來我們針對兩個TODO進(jìn)行實現(xiàn),如果當(dāng)前要序列化的對象不是數(shù)組,那么需要遍歷其所有字段,然后序列化各個字段,如果字段是類對象類型,那么還得遞歸的對他進(jìn)行處理,我們看代碼實現(xiàn):

  1.  /* 
  2.          判斷當(dāng)前要序列化的對象是否是數(shù)組類型,如果不是,那么先遍歷該對象所有字段,然后遞歸的序列化對應(yīng)字段,因為字段有可能是類對象, 
  3.          如果是數(shù)組類型,那么遍歷其中每個元素,然后針對每個元素進(jìn)行序列化 
  4.          */ 
  5.         if (objClass.isArray()) { 
  6.             handleNoArrayField(objToSerilized, objClass, target, table, elem); 
  7.         } else { 
  8.             //TODO 
  9.         } 
  10.  
  11.     private void handleNoArrayField(Object objToSeerilized, Class cls, Document target, Map table, Element parent) throws Exception { 
  12.         Field[] fields = this.iterateClassFields(cls); 
  13.         for (int i = 0; i < fields.length; i++) { 
  14.             if (!Modifier.isPublic(fields[i].getModifiers())) { 
  15.                 fields[i].setAccessible(true); //如果不是公有字段,那么需要設(shè)置它的可讀取性 
  16.             } 
  17.  
  18.             Element fElt = new Element("field"); //針對該字段插入xml元素 
  19.             fElt.setAttribute("name", fields[i].getName()); 
  20.             Class declClass = fields[i].getDeclaringClass(); //獲取字段對應(yīng)的類 
  21.             fElt.setAttribute("declaringclass", declClass.getName()); 
  22.             Class fieldType = fields[i].getType(); //獲得該字段類型對應(yīng)的元類 
  23.             Object child = fields[i].get(objToSeerilized); //獲得字段對應(yīng)的實例對象 
  24.             if (Modifier.isTransient(fields[i].getModifiers())) { 
  25.                 child = null
  26.             } 
  27.  
  28.             fElt.addContent(extractContentFromField(fieldType, child, target, table)); 
  29.             parent.addContent(fElt); 
  30.         } 
  31.     } 
  32. private Element extractContentFromField(Class fieldType, Object child, Document target, Map table) throws Exception{ 
  33.         //將字段對應(yīng)的數(shù)據(jù)抽取出來 
  34.         if (child == null) { 
  35.             return new Element("null"); 
  36.         } 
  37.         else if (!fieldType.isPrimitive()) { 
  38.             Element reference = new Element("reference"); 
  39.             if (table.containsKey(child)) { 
  40.                 reference.setText(table.get(child).toString()); //任何基礎(chǔ)類型都繼承自O(shè)bject,他們都支持toString來將自身對應(yīng)的數(shù)據(jù)進(jìn)行字符串表達(dá) 
  41.             } 
  42.             else { 
  43.                 reference.setText(Integer.toString(table.size())); 
  44.                 recursiveSerilizeObject(child, target, table); //如果不是基礎(chǔ)類型,那么就遞歸的進(jìn)行序列化 
  45.             } 
  46.         } 
  47.  
  48.     } 
  49.  
  50.     private Field[] iterateClassFields(Class cls) { 
  51.         List fieldsList = new LinkedList(); //用隊列存儲對象所有字段 
  52.         while (cls != null) { 
  53.             Field[] fields = cls.getDeclaredFields(); //獲得當(dāng)前實例對應(yīng)類所聲明的所有字段 
  54.             for (int i = 0; i < fields.length; i++) { 
  55.                 if (!Modifier.isStatic(fields[i].getModifiers())) { 
  56.                     fieldsList.add(fields[i]); //如果字段不是static修飾那么就加入隊列 
  57.                 } 
  58.             } 
  59.  
  60.             cls = cls.getSuperclass(); //獲取父類然后遞歸的獲取字段 
  61.         } 
  62.  
  63.         Field[] retValue = new Field[fieldsList.size()]; 
  64.         return (Field[])fieldsList.toArray(); 
  65.     } 

我們先看第一種情況的實現(xiàn),首先遍歷當(dāng)前實例對應(yīng)類聲明的所有字段,將所有字段放入到一個隊列中然后再一一取出來進(jìn)行處理,這個功能的實現(xiàn)就在函數(shù)iterateClassFields,然后對取出的字段進(jìn)行判斷,看它是否具備public屬性,如果不具備,那么要想讀取它的內(nèi)容,我們需要調(diào)用setAccessible進(jìn)行設(shè)置,接下來還有判斷其是否是Transient類型,如果不是,那么就通過extractContentFromField來讀取字段包含的數(shù)據(jù)。

在extractContentFromField中,先判斷字段是否為基礎(chǔ)數(shù)據(jù)類型,如果是,由于基礎(chǔ)數(shù)據(jù)類型都實現(xiàn)了toString方法,于是我們可以用該方法獲得數(shù)據(jù)的字符串對應(yīng)內(nèi)容,然后寫入到xml文件中,如果它不是基礎(chǔ)類型,那么我們就調(diào)用recursiveSerilizeObject遞歸的去對他進(jìn)行序列化。

 

由于內(nèi)容相對燒腦,因此我們先在這里暫停,消化一下后再處理下一步,也就是應(yīng)對字段是數(shù)組類型的情況。

 

責(zé)任編輯:武曉燕 來源: Coding迪斯尼
相關(guān)推薦

2011-04-02 09:04:49

Java序列化

2017-05-26 10:15:39

Java高級特性反射

2021-01-20 08:24:38

序列化內(nèi)存對象

2009-03-10 13:38:01

Java序列化字節(jié)流

2022-08-06 08:41:18

序列化反序列化Hessian

2018-03-19 10:20:23

Java序列化反序列化

2013-03-11 13:55:03

JavaJSON

2009-06-14 22:01:27

Java對象序列化反序列化

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2016-11-24 12:07:42

Android萬能圓角ImageView

2010-01-08 13:25:07

ibmdwXML

2011-04-02 13:47:01

2011-06-01 15:18:43

Serializabl

2011-03-04 09:25:51

Java序列化

2009-08-06 11:16:25

C#序列化和反序列化

2023-12-13 13:49:52

Python序列化模塊

2011-05-18 15:20:13

XML

2010-03-19 15:54:21

Java Socket

2023-04-06 13:47:47

點贊
收藏

51CTO技術(shù)棧公眾號

亚洲在线观看免费视频| 国产超碰在线一区| 最近2019中文字幕mv免费看 | 亚洲激情中文字幕| 男女啪啪网站视频| 七七成人影院| 国产亚洲人成网站| 亚洲一区亚洲二区| 麻豆成人免费视频| 你懂的国产精品永久在线| 亚洲伦理中文字幕| 粗大的内捧猛烈进出视频| 中文字幕 在线观看| 亚洲欧美日本在线| 欧美美乳视频网站在线观看| 国产欧美一级片| 亚洲欧美日韩视频二区| 欧美成人久久久| 少妇人妻好深好紧精品无码| 99re8这里有精品热视频免费| 欧美在线你懂的| 国产日韩欧美精品在线观看| 日本在线观看免费| 久久久久久久综合| 国产久一道中文一区| 91中文字幕在线播放| 午夜亚洲视频| 午夜精品国产精品大乳美女| 精品在线观看一区| 国产不卡av一区二区| 精品少妇一区二区三区免费观看 | 欧美h视频在线观看| 青青久在线视频| 波多野结衣在线aⅴ中文字幕不卡| 成人福利视频网| 丰满人妻一区二区三区四区| 制服诱惑一区二区| 欧美极品少妇xxxxⅹ裸体艺术| 成人做爰视频网站| 日本一区二区在线看| 国产视频欧美视频| 亚洲天堂美女视频| 爱高潮www亚洲精品| 制服丝袜日韩国产| 日韩成人精品视频在线观看| 欧美成人福利| 欧美日韩在线播放| 色综合色综合色综合色综合| 欧美最新精品| 色婷婷av一区二区三区之一色屋| 精品少妇人妻av免费久久洗澡| 免费在线观看的电影网站| 亚洲男人都懂的| 喜爱夜蒲2在线| 成人国产免费电影| 一区二区三区中文字幕| avove在线观看| 中文字幕有码在线视频| 亚洲色图欧美偷拍| 日本天堂免费a| 日本无删减在线| 亚洲高清视频中文字幕| 国产www免费| 九色porny自拍视频在线播放| 图片区日韩欧美亚洲| www.中文字幕在线| 性欧美hd调教| 欧美日韩久久久久久| 中文字幕 欧美日韩| 久久久久久久久久久久电影| 日韩三级电影网址| 日本一区二区在线观看视频| 日韩有码一区| 亚洲最新av网址| 韩国一级黄色录像| 国内久久视频| 欧洲日韩成人av| 国产精品露脸视频| 国产精品亚洲午夜一区二区三区 | 天堂中文资源在线观看| 91丨九色丨尤物| 日韩欧美亚洲日产国| 久久综合之合合综合久久| 亚洲精品国产无天堂网2021| 免费不卡av在线| 色豆豆成人网| 日韩三级视频在线观看| 亚洲一区二区三区无码久久| 欧美日韩水蜜桃| 大量国产精品视频| 国产超碰人人爽人人做人人爱| 日韩在线观看一区二区| 亚洲伊人久久综合| 日韩精品视频无播放器在线看| 国产蜜臀97一区二区三区| 浴室偷拍美女洗澡456在线| 男人av在线播放| 精品视频全国免费看| 人妻 丝袜美腿 中文字幕| 美女亚洲一区| 欧美日本高清视频| 波多野结衣一区二区三区在线| 精品一区二区免费| 精品亚洲欧美日韩| 麻豆传媒在线免费看| 欧美视频第一页| 粗大的内捧猛烈进出视频| 国产精品入口久久| 欧美猛男性生活免费| 四虎精品永久在线| 国产ts人妖一区二区| 欧美主播一区二区三区美女 久久精品人 | 久久爱www久久做| 国模一区二区三区私拍视频| 在线免费黄色| 日韩欧美国产高清91| 男人午夜视频在线观看| 欧美日韩国产高清电影| 69久久夜色精品国产7777| 国产乱子伦精品无码码专区| 久久精品欧美日韩精品| 水蜜桃色314在线观看| 粉嫩av国产一区二区三区| 日韩久久午夜影院| 久久久久久蜜桃| 久草这里只有精品视频| 欧美日韩免费观看一区| xxxcom在线观看| 日韩写真欧美这视频| 制服丨自拍丨欧美丨动漫丨| 日日夜夜免费精品| 激情小说综合区| 好看的中文字幕在线播放| 欧美一区日韩一区| 天天色天天综合| 美女网站色91| 午夜精品一区二区在线观看| 伊人久久av| 日韩黄色在线免费观看| 国产成人在线免费观看视频| 国产成人在线视频网址| 日本一级淫片演员| 国产精品欧美一区二区三区不卡| 中文日韩在线视频| 青青视频在线免费观看| 国产日韩欧美精品一区| 日韩手机在线观看视频| 女人丝袜激情亚洲| 国产成人中文字幕| 高清日韩av电影| 欧美色男人天堂| 欧美福利在线视频| 精品一区二区三区日韩| 樱空桃在线播放| 久久丁香四色| 久久久久久久亚洲精品| 人妻91麻豆一区二区三区| 亚洲一区av在线| 97香蕉碰碰人妻国产欧美| 日韩亚洲精品在线| 欧美精品国产精品久久久| 美女18一级毛片一品久道久久综合| 亚洲精品视频在线观看视频| 国产一区二区视频免费| 国产精品私人影院| 爽爽爽在线观看| 国产综合网站| 久久国产精品免费一区| 成人黄色免费短视频| 亚洲色图在线观看| 中文字幕免费播放| 亚洲三级电影全部在线观看高清| 日本中文字幕在线不卡| 韩国av一区| 久久精品综合一区| 成人毛片免费| 欧美疯狂xxxx大交乱88av| 亚洲av成人无码久久精品老人| 色综合视频在线观看| av在线免费播放网址| 国产精品一区二区你懂的| 精品少妇在线视频| 成人羞羞在线观看网站| 成人乱人伦精品视频在线观看| 污污的网站在线免费观看| 亚洲第一中文字幕| 亚洲精品一区二区二区| 亚洲精品伦理在线| 久久久久亚洲av无码专区桃色| 男女男精品网站| 精品丰满人妻无套内射| 欧美限制电影| 国产日韩二区| 黄色欧美视频| 2019最新中文字幕| 麻豆视频在线免费观看| 国产丝袜一区二区三区| 国产一区二区三区四区视频| 同产精品九九九| 久久国产波多野结衣| 97久久超碰国产精品| 91国内在线播放| 久久成人免费| 日韩不卡视频一区二区| japanese国产精品| 国产精品一区二区三区观看| 高清欧美日韩| 青青草原一区二区| 性爱视频在线播放| 色伦专区97中文字幕| 香蕉国产在线视频| 日韩美女一区二区三区四区| 免费看av在线| 精品久久久久久中文字幕| 91在线播放观看| 欧美激情一区二区三区蜜桃视频| 91成人在线观看喷潮蘑菇| 老司机一区二区| 任你操这里只有精品| 最新日韩av| 免费看黄色a级片| 91麻豆精品国产91久久久平台| 免费在线观看一区二区| 成人av动漫| 亚洲综合中文字幕在线观看| 日韩一级特黄| 国产精品美女午夜av| 国产在线美女| 欧美精品videosex极品1| www在线视频| 久久久精品国产网站| 在线日本中文字幕| 国产亚洲一区精品| 国产一级片在线| 精品亚洲夜色av98在线观看 | 欧洲av不卡| 992tv成人免费影院| 成人在线免费观看黄色| 欧美国产精品va在线观看| 在线观看免费视频你懂的| 精品国内亚洲在观看18黄 | 欧美激情视频网| 91麻豆免费在线视频| 久久精品国产清自在天天线| 日本综合在线| 日韩中文字幕不卡视频| 香蕉视频在线看| 日日狠狠久久偷偷四色综合免费| chinese偷拍一区二区三区| 国产亚洲欧美aaaa| 91ph在线| 精品久久久av| 亚洲区欧洲区| 高清在线视频日韩欧美| av成人 com a| 热re91久久精品国99热蜜臀| 国产精品扒开腿做爽爽爽视频软件| 国产98色在线| av成人免费看| 91亚洲va在线va天堂va国| 日韩精品一级| 精品免费日产一区一区三区免费| 久久精品国产亚洲blacked| 久久国产欧美精品| 欧美日韩国产一区二区三区不卡| 先锋影音日韩| 正在播放日韩欧美一页| 性欧美大战久久久久久久| 亚洲一卡久久| 孩娇小videos精品| 国产精品影视在线| 久久福利小视频| 中文字幕乱码日本亚洲一区二区 | 国产电影一区二区在线观看| 国产精品一二三在线观看| 在线播放精品| 亚洲精品乱码久久久久久自慰| 欧美aaa在线| 国产调教打屁股xxxx网站| 久久亚洲捆绑美女| 91麻豆精品久久毛片一级| 亚洲综合免费观看高清完整版在线| 久草国产精品视频| 欧美揉bbbbb揉bbbbb| 国产成a人亚洲精v品无码| 日韩电影中文字幕在线观看| 3p在线观看| 午夜精品在线视频| www.一区| 国产一区二区三区奇米久涩| 成人黄色av| 欧美一级视频免费看| 日韩在线一区二区| 老司机午夜免费福利| 欧美激情综合五月色丁香小说| 久草成人在线视频| 在线观看精品一区| 欧美一级特黄aaaaaa| 在线视频免费一区二区| 91九色在线播放| 成人黄色在线免费| 欧美禁忌电影网| 日本手机在线视频| 久久99精品国产91久久来源| 成人网站免费观看| 亚洲免费av网站| а中文在线天堂| 亚洲国产中文字幕久久网 | 第一社区sis001原创亚洲| 国产xxxx振车| 精品影院一区二区久久久| 高清中文字幕mv的电影| 中文字幕在线观看不卡| 国产免费一区二区三区四区五区| 日韩免费观看高清完整版在线观看| 在线国产情侣| 国产a级全部精品| 国产区精品视频在线观看豆花| 在线免费一区| 老司机精品视频网站| 亚洲一区二区在线免费| 亚洲精品写真福利| 中文字幕第一页在线播放| 亚洲免费福利视频| 国产伦理精品| 国产乱子伦精品| 韩国亚洲精品| 国产91在线免费观看| 亚洲免费在线视频一区 二区| 亚洲精品一区二三区| 亚洲美女久久久| 丰满诱人av在线播放| av激情久久| 一区二区中文| 欧美视频国产视频| 亚洲天堂免费在线观看视频| www.av88| 中文字幕成人精品久久不卡| 亚洲日本网址| 日韩福利在线| 免费看黄色91| 人人妻人人澡人人爽| 日韩欧美中文免费| 久久99久久| 国产激情综合五月久久| 欧美欧美黄在线二区| 99热成人精品热久久66| 久久综合九色综合97_久久久| 精品肉丝脚一区二区三区| 精品久久国产字幕高潮| 日本电影在线观看| 精品免费国产| 久久久久一区| 亚洲激情图片网| 51久久夜色精品国产麻豆| 成人国产免费电影| 国产精华一区| 国产精品乱看| 亚洲性猛交xxxx乱大交| 欧美日韩一区二区三区在线看| 尤物网址在线观看| 97超碰在线播放| 亚洲免费激情| 五月天精品视频| 欧美日韩精品欧美日韩精品一| 日本不卡不卡| 国产91精品一区二区绿帽| 亚洲视频播放| 国产激情av在线| 欧美一级艳片视频免费观看| 18在线观看的| 美女精品国产| 开心九九激情九九欧美日韩精美视频电影| 成年人视频软件| 欧美mv日韩mv国产| 黄色综合网址| 影音先锋男人的网站| 成人丝袜高跟foot| 波多野结衣一区二区三区在线| 欧美成人免费视频| 欧洲在线一区| 拔插拔插华人永久免费| 天天射综合影视| 看黄网站在线| 久久99精品久久久久久秒播放器 | 欧美视频国产精品| 男人天堂久久久| 国产自产精品| 久久精品国产成人一区二区三区| 精品在线免费观看视频| 亚洲性生活视频在线观看| 精品国产不卡一区二区| 国产男女无遮挡| 亚洲精品国产精华液| 国产中文字幕在线| av成人免费观看| 青青草国产精品97视觉盛宴| 免费一级特黄特色大片| 中文精品99久久国产香蕉| 欧美黑人巨大videos精品|