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

你不知道的5個(gè)Java有用的工具

開發(fā) 后端
您覺得自己懂 Java 編程?事實(shí)是,大多數(shù)開發(fā)人員都只領(lǐng)會(huì)到了 Java 平臺(tái)的皮毛,所學(xué)也只夠應(yīng)付工作。有些Java工具無法分類,只能算作 “有用的東西”。這是developerworks5件事系列中介紹一些您樂于擁有的工具,即使您將它們放到廚房抽屜里。

編者按:本文為 Neward & Associates 的主管Ted Neward 撰寫的5件你不知道的事情系列的最后一篇(至少目前是這樣)。Ted Neward 在Neward & Associates負(fù)責(zé)有關(guān) Java、.NET、XML 服務(wù)和其他平臺(tái)的咨詢、指導(dǎo)、培訓(xùn)和推介。他現(xiàn)在居住在華盛頓州西雅圖附近。以下為本文的譯文:

很多年前,當(dāng)我還是高中生的時(shí)候,我曾考慮以小說作家作為我的職業(yè)追求,我訂閱了一本 Writer's Digest 雜志。我記得其中有篇專欄文章,是關(guān)于 “太小而難以保存的線頭”,專欄作者描述廚房?jī)?chǔ)物抽屜中放滿了無法分類的玩意兒。這句話我一直銘記在心,它正好用來描述本文的內(nèi)容,本Java 平臺(tái)就充滿了這樣的 “線頭” — 有用的命令行工具和庫,大多數(shù) Java 開發(fā)人員甚至都不知道,更別提使用了。其中很多無法劃分到之前的 5 件事 系列 的編程分類中,但不管怎樣,嘗試一下:有些說不定會(huì)在您編程的廚房抽屜中占得一席之地。

1. StAX

在千禧年左右,當(dāng) XML 第一次出現(xiàn)在很多 Java 開發(fā)人員面前時(shí),有兩種基本的解析 XML 文件的方法。SAX 解析器實(shí)際是由程序員對(duì)事件調(diào)用一系列回調(diào)方法的大型狀態(tài)機(jī)。DOM 解析器將整個(gè) XML 文檔加入內(nèi)存,并切割成離散的對(duì)象,它們連接在一起形成一個(gè)樹。該樹描述了文檔的整個(gè) XML Infoset 表示法。這兩個(gè)解析器都有缺點(diǎn):SAX 太低級(jí),無法使用,DOM 代價(jià)太大,尤其對(duì)于大的 XML 文件 — 整個(gè)樹成了一個(gè)龐然大物。

幸運(yùn)的是,Java 開發(fā)人員找到第三種方法來解析 XML 文件,通過對(duì)文檔建模成 “節(jié)點(diǎn)”,它們可以從文檔流中一次取出一個(gè),檢查,然后處理或丟棄。這些 “節(jié)點(diǎn)” 的 “流” 提供了 SAX 和 DOM 的中間地帶,名為 “Streaming API for XML”,或者叫做StAX。(此縮寫用于區(qū)分新的 API 與原來的 SAX 解析器,它與此同名。)StAX 解析器后來包裝到了 JDK 中,在 javax.xml.stream 包。

使用 StAX 相當(dāng)簡(jiǎn)單:實(shí)例化 XMLEventReader,將它指向一個(gè)格式良好的 XML 文件,然后一次 “拉出” 一個(gè)節(jié)點(diǎn)(通常用 while 循環(huán)),查看。例如,在清單 1 中,列舉出了 Ant 構(gòu)造腳本中的所有目標(biāo):

清單 1. 只是讓 StAX 指向目標(biāo)

  1.       
  2. import java.io.*;  
  3. import javax.xml.namespace.QName;  
  4. import javax.xml.stream.*;  
  5. import javax.xml.stream.events.*;  
  6. import javax.xml.stream.util.*;  
  7.  
  8. public class Targets  
  9. {  
  10.     public static void main(String[] args)  
  11.         throws Exception  
  12.     {  
  13.         for (String arg : args)  
  14.         {  
  15.             XMLEventReader xsr =   
  16.                 XMLInputFactory.newInstance()  
  17.                     .createXMLEventReader(new FileReader(arg));  
  18.             while (xsr.hasNext())  
  19.             {  
  20.                 XMLEvent evt = xsr.nextEvent();  
  21.                 switch (evt.getEventType())  
  22.                 {  
  23.                     case XMLEvent.START_ELEMENT:  
  24.                     {  
  25.                         StartElement se = evt.asStartElement();  
  26.                         if (se.getName().getLocalPart().equals("target"))  
  27.                         {  
  28.                             Attribute targetName =   
  29.                                 se.getAttributeByName(new QName("name"));  
  30.                             // Found a target!  
  31.                             System.out.println(targetName.getValue());  
  32.                         }  
  33.                         break;  
  34.                     }  
  35.                     // Ignore everything else  
  36.                 }  
  37.             }  
  38.         }  
  39.     }  
  40. }  
  41.  

StAX 解析器不會(huì)替換所有的 SAX 和 DOM 代碼。但肯定會(huì)讓某些任務(wù)容易些。尤其對(duì)完成不需要知道 XML 文檔整個(gè)樹結(jié)構(gòu)的任務(wù)相當(dāng)方便。

請(qǐng)注意,如果事件對(duì)象級(jí)別太高,無法使用,StAX 也有一個(gè)低級(jí) API 在 XMLStreamReader 中。盡管也許沒有閱讀器有用,StAX 還有一個(gè) XMLEventWriter,同樣,還有一個(gè) XMLStreamWriter 類用于 XML 輸出。

#p#

2. ServiceLoader

Java 開發(fā)人員經(jīng)常希望將使用和創(chuàng)建組件的內(nèi)容區(qū)分開來。這通常是通過創(chuàng)建一個(gè)描述組件動(dòng)作的接口,并使用某種中介創(chuàng)建組件實(shí)例來完成的。很多開發(fā)人員使用 Spring 框架來完成,但還有其他的方法,它比 Spring 容器更輕量級(jí)。

java.util 的 ServiceLoader 類能讀取隱藏在 JAR 文件中的配置文件,并找到接口的實(shí)現(xiàn),然后使這些實(shí)現(xiàn)成為可選擇的列表。例如,如果您需要一個(gè)私仆(personal-servant)組件來完成任務(wù),您可以使用清單 2 中的代碼來實(shí)現(xiàn):

清單 2. IPersonalServant

  1.       
  2. public interface IPersonalServant  
  3. {  
  4.     // Process a file of commands to the servant  
  5.     public void process(java.io.File f)  
  6.         throws java.io.IOException;  
  7.     public boolean can(String command);  
  8. }  

can() 方法可讓您確定所提供的私仆實(shí)現(xiàn)是否滿足需求。清單 3 中的 ServiceLoader 的 IPersonalServant 列表基本上滿足需求:

清單 3. IPersonalServant 行嗎?

  1.       
  2. import java.io.*;  
  3. import java.util.*;  
  4.  
  5. public class Servant  
  6. {  
  7.     public static void main(String[] args)  
  8.         throws IOException  
  9.     {  
  10.         ServiceLoader<IPersonalServant> servantLoader =   
  11.             ServiceLoader.load(IPersonalServant.class);  
  12.  
  13.         IPersonalServant i = null;  
  14.         for (IPersonalServant ii : servantLoader)  
  15.             if (ii.can("fetch tea"))  
  16.                 i = ii;  
  17.  
  18.         if (i == null)  
  19.             throw new IllegalArgumentException("No suitable servant found");  
  20.           
  21.         for (String arg : args)  
  22.         {  
  23.             i.process(new File(arg));  
  24.         }  
  25.     }  
  26. }  
  27.  

假設(shè)有此接口的實(shí)現(xiàn),如清單 4:

清單 4. Jeeves 實(shí)現(xiàn)了 IPersonalServant

  1. import java.io.*;  
  2.  
  3. public class Jeeves  
  4.     implements IPersonalServant  
  5. {  
  6.     public void process(File f)  
  7.     {  
  8.         System.out.println("Very good, sir.");  
  9.     }  
  10.     public boolean can(String cmd)  
  11.     {  
  12.         if (cmd.equals("fetch tea"))  
  13.             return true;  
  14.         else  
  15.             return false;  
  16.     }  
  17. }  
  18.  

剩下的就是配置包含實(shí)現(xiàn)的 JAR 文件,讓 ServiceLoader 能識(shí)別 — 這可能會(huì)非常棘手。JDK 想要 JAR 文件有一個(gè) META-INF/services 目錄,它包含一個(gè)文本文件,其文件名與接口類名完全匹配 — 本例中是 META-INF/services/IPersonalServant。接口類名的內(nèi)容是實(shí)現(xiàn)的名稱,每行一個(gè),如清單 5:

清單 5. META-INF/services/IPersonalServant

  1.       
  2. Jeeves   # comments are OK  

幸運(yùn)的是,Ant 構(gòu)建系統(tǒng)(自 1.7.0 以來)包含一個(gè)對(duì) jar 任務(wù)的服務(wù)標(biāo)簽,讓這相對(duì)容易,見清單 6:

清單 6. Ant 構(gòu)建的 IPersonalServant

  1.  
  2. <target name="serviceloader" depends="build"> 
  3.     <jar destfile="misc.jar" basedir="./classes"> 
  4.         <service type="IPersonalServant"> 
  5.             <provider classname="Jeeves" /> 
  6.         </service> 
  7.     </jar> 
  8. </target> 

這里,很容易調(diào)用 IPersonalServant,讓它執(zhí)行命令。然而,解析和執(zhí)行這些命令可能會(huì)非常棘手。這又是另一個(gè) “小線頭”。

#p#

3. Scanner

有無數(shù) Java 工具能幫助您構(gòu)建解析器,很多函數(shù)語言已成功構(gòu)建解析器函數(shù)庫(解析器選擇器)。但如果要解析的是逗號(hào)分隔值文件,或空格分隔文本文件,又怎么辦呢?大多數(shù)工具用在此處就過于隆重了,而 String.split() 又不夠。(對(duì)于正則表達(dá)式,請(qǐng)記住一句老話:“ 您有一個(gè)問題,用正則表達(dá)式解決。那您就有兩個(gè)問題了。”)

Java 平臺(tái)的 Scanner 類會(huì)是這些類中您最好的選擇。以輕量級(jí)文本解析器為目標(biāo),Scanner 提供了一個(gè)相對(duì)簡(jiǎn)單的 API,用于提取結(jié)構(gòu)化文本,并放入強(qiáng)類型的部分。想象一下,如果您愿意,一組類似 DSL 的命令(源自 Terry Pratchett Discworld 小說)排列在文本文件中,如清單 7:

清單 7. Igor 的任務(wù)

  1.       
  2. fetch 1 head  
  3. fetch 3 eye  
  4. fetch 1 foot  
  5. attach foot to head  
  6. attach eye to head  
  7. admire  

您,或者是本例中稱為 Igor的私仆,能輕松使用 Scanner 解析這組違法命令,如清單 8 所示:

清單 8. Igor 的任務(wù),由 Scanner 解析

  1.       
  2. import java.io.*;  
  3. import java.util.*;  
  4.  
  5. public class Igor  
  6.     implements IPersonalServant  
  7. {  
  8.     public boolean can(String cmd)  
  9.     {  
  10.         if (cmd.equals("fetch body parts"))  
  11.             return true;  
  12.         if (cmd.equals("attach body parts"))  
  13.             return true;  
  14.         else  
  15.             return false;  
  16.     }  
  17.     public void process(File commandFile)  
  18.         throws FileNotFoundException  
  19.     {  
  20.         Scanner scanner = new Scanner(commandFile);  
  21.         // Commands come in a verb/number/noun or verb form  
  22.         while (scanner.hasNext())  
  23.         {  
  24.             String verb = scanner.next();  
  25.             if (verb.equals("fetch"))  
  26.             {  
  27.                 int num = scanner.nextInt();  
  28.                 String type = scanner.next();  
  29.                 fetch (num, type);  
  30.             }  
  31.             else if (verb.equals("attach"))  
  32.             {  
  33.                 String item = scanner.next();  
  34.                 String to = scanner.next();  
  35.                 String target = scanner.next();  
  36.                 attach(item, target);  
  37.             }  
  38.             else if (verb.equals("admire"))  
  39.             {  
  40.                 admire();  
  41.             }  
  42.             else  
  43.             {  
  44.                 System.out.println("I don't know how to "   
  45.                     + verb + ", marthter.");  
  46.             }  
  47.         }  
  48.     }  
  49.       
  50.     public void fetch(int number, String type)  
  51.     {  
  52.         if (parts.get(type) == null)  
  53.         {  
  54.             System.out.println("Fetching " + number + " "   
  55.                 + type + (number > 1 ? "s" : "") + ", marthter!");  
  56.             parts.put(type, number);  
  57.         }  
  58.         else  
  59.         {  
  60.             System.out.println("Fetching " + number + " more "   
  61.                 + type + (number > 1 ? "s" : "") + ", marthter!");  
  62.             Integer currentTotal = parts.get(type);  
  63.             parts.put(type, currentTotal + number);  
  64.         }  
  65.         System.out.println("We now have " + parts.toString());  
  66.     }  
  67.       
  68.     public void attach(String item, String target)  
  69.     {  
  70.         System.out.println("Attaching the " + item + " to the " +  
  71.             target + ", marthter!");  
  72.     }  
  73.       
  74.     public void admire()  
  75.     {  
  76.         System.out.println("It'th quite the creathion, marthter");  
  77.     }  
  78.       
  79.     private Map<String, Integer> parts = new HashMap<String, Integer>();  
  80. }  
  81.  

假設(shè) Igor 已在 ServantLoader 中注冊(cè),可以很方便地將 can() 調(diào)用改得更實(shí)用,并重用前面的 Servant 代碼,如清單 9 所示:

清單 9. Igor 做了什么

  1. import java.io.*;  
  2. import java.util.*;  
  3.  
  4. public class Servant  
  5. {  
  6.     public static void main(String[] args)  
  7.         throws IOException  
  8.     {  
  9.         ServiceLoader<IPersonalServant> servantLoader =   
  10.             ServiceLoader.load(IPersonalServant.class);  
  11.  
  12.         IPersonalServant i = null;  
  13.         for (IPersonalServant ii : servantLoader)  
  14.             if (ii.can("fetch body parts"))  
  15.                 i = ii;  
  16.  
  17.         if (i == null)  
  18.             throw new IllegalArgumentException("No suitable servant found");  
  19.           
  20.         for (String arg : args)  
  21.         {  
  22.             i.process(new File(arg));  
  23.         }  
  24.     }  
  25. }  
  26.  

真正 DSL 實(shí)現(xiàn)顯然不會(huì)僅僅打印到標(biāo)準(zhǔn)輸出流。我把追蹤哪些部分、跟隨哪些部分的細(xì)節(jié)留待給您(當(dāng)然,還有忠誠的 Igor)。

#p#

4. Timer

java.util.Timer 和 TimerTask 類提供了方便、相對(duì)簡(jiǎn)單的方法可在定期或一次性延遲的基礎(chǔ)上執(zhí)行任務(wù):

清單 10. 稍后執(zhí)行

  1. import java.util.*;  
  2.  
  3. public class Later  
  4. {  
  5.     public static void main(String[] args)  
  6.     {  
  7.         Timer t = new Timer("TimerThread");  
  8.         t.schedule(new TimerTask() {  
  9.             public void run() {  
  10.                 System.out.println("This is later");  
  11.                 System.exit(0);  
  12.             }  
  13.         }, 1 * 1000);  
  14.         System.out.println("Exiting main()");  
  15.     }  
  16. }  
  17.  

Timer 有許多 schedule() 重載,它們提示某一任務(wù)是一次性還是重復(fù)的,并且有一個(gè)啟動(dòng)的 TimerTask 實(shí)例。TimerTask 實(shí)際上是一個(gè) Runnable(事實(shí)上,它實(shí)現(xiàn)了它),但還有另外兩個(gè)方法:cancel() 用來取消任務(wù),scheduledExecutionTime() 用來返回任務(wù)何時(shí)啟動(dòng)的近似值。

請(qǐng)注意 Timer 卻創(chuàng)建了一個(gè)非守護(hù)線程在后臺(tái)啟動(dòng)任務(wù),因此在清單 10 中我需要調(diào)用 System.exit() 來取消任務(wù)。在長時(shí)間運(yùn)行的程序中,最好創(chuàng)建一個(gè) Timer 守護(hù)線程(使用帶有指示守護(hù)線程狀態(tài)的參數(shù)的構(gòu)造函數(shù)),從而它不會(huì)讓 VM 活動(dòng)。

這個(gè)類沒什么神奇的,但它確實(shí)能幫助我們對(duì)后臺(tái)啟動(dòng)的程序的目的了解得更清楚。它還能節(jié)省一些 Thread 代碼,并作為輕量級(jí) ScheduledExecutorService(對(duì)于還沒準(zhǔn)備好了解整個(gè) java.util.concurrent 包的人來說)。

#p#

5. JavaSound

盡管在服務(wù)器端應(yīng)用程序中不常出現(xiàn),但 sound 對(duì)管理員有著有用的 “被動(dòng)” 意義 — 它是惡作劇的好材料。盡管它很晚才出現(xiàn)在 Java 平臺(tái)中,JavaSound API 最終還是加入了核心運(yùn)行時(shí)庫,封裝在 javax.sound * 包 — 其中一個(gè)包是 MIDI 文件,另一個(gè)是音頻文件示例(如普遍的 .WAV 文件格式)。

JavaSound 的 “hello world” 是播放一個(gè)片段,如清單 11 所示:

清單 11. 再放一遍,Sam

  1. public static void playClip(String audioFile)  
  2. {  
  3.     try  
  4.     {  
  5.         AudioInputStream inputStream =  
  6.             AudioSystem.getAudioInputStream(  
  7.                 this.getClass().getResourceAsStream(audioFile));  
  8.         DataLine.Info info =   
  9.             new DataLine.Info( Clip.class, audioInputStream.getFormat() );  
  10.         Clip clip = (Clip) AudioSystem.getLine(info);  
  11.         clip.addLineListener(new LineListener() {  
  12.                 public void update(LineEvent e) {  
  13.                     if (e.getType() == LineEvent.Type.STOP) {  
  14.                         synchronized(clip) {  
  15.                             clip.notify();  
  16.                         }  
  17.                     }  
  18.                 }  
  19.             });  
  20.         clip.open(audioInputStream);          
  21.           
  22.         clip.setFramePosition(0);  
  23.  
  24.         clip.start();  
  25.         synchronized (clip) {  
  26.             clip.wait();  
  27.         }  
  28.         clip.drain();  
  29.         clip.close();  
  30.     }  
  31.     catch (Exception ex)  
  32.     {  
  33.         ex.printStackTrace();  
  34.     }  
  35. }  
  36.  

大多數(shù)還是相當(dāng)簡(jiǎn)單(至少 JavaSound 一樣簡(jiǎn)單)。第一步是創(chuàng)建一個(gè)文件的 AudioInputStream 來播放。為了讓此方法盡量與上下文無關(guān),我們從加載類的 ClassLoader 中抓取文件作為 InputStream。(AudioSystem 還需要一個(gè) File 或 String,如果提前知道聲音文件的具體路徑。)一旦完成, DataLine.Info 對(duì)象就提供給 AudioSystem,得到一個(gè) Clip,這是播放音頻片段最簡(jiǎn)單的方法。(其他方法提供了對(duì)片段更多的控制 — 例如獲取一個(gè) SourceDataLine — 但對(duì)于 “播放” 來說,過于復(fù)雜)。

這里應(yīng)該和對(duì) AudioInputStream 調(diào)用 open() 一樣簡(jiǎn)單。(“應(yīng)該” 的意思是如果您沒遇到下節(jié)描述的錯(cuò)誤。)調(diào)用 start() 開始播放,drain() 等待播放完成,close() 釋放音頻線路。播放是在單獨(dú)的線程進(jìn)行,因此調(diào)用 stop() 將會(huì)停止播放,然后調(diào)用 start() 將會(huì)從播放暫停的地方重新開始;使用 setFramePosition(0) 重新定位到開始。

沒聲音?

JDK 5 發(fā)行版中有個(gè)討厭的小錯(cuò)誤:在有些平臺(tái)上,對(duì)于一些短的音頻片段,代碼看上去運(yùn)行正常,但就是 ... 沒聲音。顯然媒體播放器在應(yīng)該出現(xiàn)的位置之前觸發(fā)了 STOP 事件。(見 參考資料 一節(jié)中錯(cuò)誤頁的鏈接。)

這個(gè)錯(cuò)誤 “無法修復(fù)”,但解決方法相當(dāng)簡(jiǎn)單:注冊(cè)一個(gè) LineListener 來監(jiān)聽 STOP 事件,當(dāng)觸發(fā)時(shí),調(diào)用片段對(duì)象的 notifyAll()。然后在 “調(diào)用者” 代碼中,通過調(diào)用 wait() 等待片段完成(還調(diào)用 notifyAll())。在沒出現(xiàn)錯(cuò)誤的平臺(tái)上,這些錯(cuò)誤是多余的,在 Windows® 及有些 Linux® 版本上,會(huì)讓程序員 “開心” 或 “憤怒”。

結(jié)束語

現(xiàn)在您都了解了,廚房里的工具。我知道很多人已清楚了解我此處介紹的工具,而我的職業(yè)經(jīng)驗(yàn)告訴我,很多人將從這篇介紹文章,或者說是對(duì)長期遺忘在凌亂的抽屜中的小工具的提示中受益。

我在此系列中做個(gè)簡(jiǎn)短的中斷,讓別人能加入分享他們各自領(lǐng)域的專業(yè)經(jīng)驗(yàn)。但別擔(dān)心,我還會(huì)回來的,無論是本系列還是探索其他領(lǐng)域的新的 5 件事。在那之前,我鼓勵(lì)您一直探索 Java 平臺(tái),去發(fā)現(xiàn)那些能讓編程更高效的寶石。

【編輯推薦】

  1. 你不知道的5個(gè)JVM命令行標(biāo)志
  2. 關(guān)于Java對(duì)象序列化您不知道的5件事
  3. 你不知道的Java秘密
責(zé)任編輯:佚名 來源: developerworks
相關(guān)推薦

2019-04-30 08:09:12

Windows 10操作系統(tǒng)工具

2020-06-22 08:09:22

GitHub工具開發(fā)

2010-08-23 09:56:09

Java性能監(jiān)控

2024-10-21 17:46:54

前端開發(fā)

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2022-08-13 09:19:07

Bash命令Linux

2023-12-21 14:40:09

Python編程語言

2019-11-29 16:49:42

HTML語言開發(fā)

2024-05-20 09:27:00

Web 開發(fā)CSS

2022-01-17 22:33:37

Java特定類型

2010-10-13 13:20:04

命令行標(biāo)志JVM

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機(jī)制操作系統(tǒng)

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2013-05-31 10:57:32

html5html5 api

2015-05-13 11:02:07

Linux網(wǎng)絡(luò)工具網(wǎng)絡(luò)工具

2015-05-13 11:03:29

LinuxLinux工具

2025-05-08 08:59:19

前端技巧
點(diǎn)贊
收藏

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

99久久一区三区四区免费| 欧美群妇大交群的观看方式| 国产精品99免视看9| 永久看看免费大片| 色屁屁www国产馆在线观看| 青青国产91久久久久久| 亚洲国产欧美一区二区三区同亚洲| 亚洲资源在线网| 亚洲精品福利网站| 久久综合图片| 欧美国产第二页| 色欲AV无码精品一区二区久久| 岛国av在线网站| 国产精品久久久久一区| 国产精品va在线| 欧美成人精品欧美一| 疯狂欧洲av久久成人av电影 | 国产精品入口福利| 久久久久久久久久久久久久免费看| 欧美天堂一区| 狠狠躁夜夜躁人人爽天天天天97| 国产区欧美区日韩区| 免费看一级一片| 第一sis亚洲原创| 亚洲成色777777女色窝| 国产 日韩 欧美在线| 亚洲精品一区二区三区区别| 国产一区亚洲| 日韩中文字幕视频| 精品人伦一区二区三电影| 日本在线中文字幕一区二区三区| 久久久久久黄色| 91香蕉视频在线下载| 久久久久久久久99| 亚洲精品99| 色狠狠久久aa北条麻妃 | 国产亚洲综合av| 国产一区二区三区色淫影院| 天堂网av手机版| 欧美午夜电影在线观看| 亚洲精品mp4| 图片区偷拍区小说区| 成人影音在线| 亚洲久草在线视频| 成人短视频在线看| 免费黄色电影在线观看| 国产不卡在线一区| 97人人模人人爽人人喊38tv| 天天爽夜夜爽夜夜爽精品| 久久av资源| 日韩成人av网| 国产色视频一区二区三区qq号| 国产精品久久亚洲不卡| 亚洲欧美日本韩国| 中文字幕日韩一区二区三区不卡| 亚洲国产精品二区| 国v精品久久久网| 成人免费视频视频在| 国产免费www| 日韩激情av在线| 国产精品视频yy9099| 九九热这里有精品视频| 伊甸园亚洲一区| 亚洲免费一级电影| 一区二区三区久久久久| 中文字幕久久精品一区二区| 色婷婷av一区| 国产精品入口免费软件| 午夜小视频在线观看| 久久久国产一区二区三区四区小说 | 国产jk精品白丝av在线观看| 99久久999| 精品少妇一区二区三区免费观看| www.超碰com| 成人在线观看免费视频| 黑人巨大精品欧美一区二区免费 | 牛夜精品久久久久久久99黑人| 亚洲精品99久久久久| 夜夜夜夜夜夜操| 在线免费成人| 亚洲国产高清福利视频| 亚洲高清在线不卡| swag国产精品一区二区| 欧美电影影音先锋| 日本中文字幕有码| 日韩av系列| 最近免费中文字幕视频2019| 国产伦精品一区二区免费| 国产精品66| 欧美成人精品福利| 久久亚洲AV成人无码国产野外| 日韩中文字幕无砖| 日韩精品免费在线观看| 91超薄肉色丝袜交足高跟凉鞋| 欧美日韩免费电影| 日韩欧美的一区二区| av中文字幕网址| 成人av婷婷| 一区二区在线视频播放| 色婷婷av777| 91超碰国产精品| 欧美一级免费看| 精品人妻aV中文字幕乱码色欲 | 国产艳妇疯狂做爰视频 | 亚洲成人在线网| 免费黄色在线网址| 99国产精品久久久久久久成人热 | 成人精品国产一区二区4080| 91精品在线播放| 色久视频在线播放| 一区二区三区在线视频免费| 黄瓜视频免费观看在线观看www| 极品白浆推特女神在线观看| 91香蕉视频mp4| 强开小嫩苞一区二区三区网站 | 日韩av免费在线观看| 日本三级中文字幕| 久久99国内精品| 欧美日韩综合网| 波多野结衣久久| 91精品欧美福利在线观看| 污网站在线免费| 国产麻豆一区二区三区精品视频| 国产一区二区三区网站| 日韩视频在线观看免费视频| 精品freesex老太交| 在线视频精品一| 黄色大片网站在线观看| 久久五月激情| 久久riav| av手机在线观看| 欧美成人精品1314www| 美女又爽又黄视频毛茸茸| 国产精品美女久久久久久不卡 | 日本猛少妇色xxxxx免费网站| 菠萝蜜一区二区| 全球成人中文在线| 无套内谢的新婚少妇国语播放| 国产性天天综合网| 97成人在线观看视频| 欧美一级做一级爱a做片性| 91精品国产一区二区| 亚洲天堂av网站| 亚洲第一毛片| 精品免费视频123区| www.亚洲.com| 欧美亚洲国产一区二区三区va| 亚洲一区二区福利视频| 成人在线视频你懂的| 亚洲美女福利视频网站| 日韩欧美综合视频| 国产一区二区三区四区五区美女 | 欧美一区免费| 91免费的视频在线播放| 手机看片一区二区| 精品美女永久免费视频| 国产三级三级看三级| 丁香5月婷婷久久| 欧美大片第1页| 天堂国产一区二区三区| 国产精品乱人伦中文| 可以看毛片的网址| 欧美a一欧美| 国产mv免费观看入口亚洲| 亚洲va久久久噜噜噜无码久久| 国产亚洲短视频| 91丨九色丨蝌蚪| 国模吧视频一区| 久99久视频| 日本精品在线一区| 欧美另类精品xxxx孕妇| 波多野结衣激情视频| 成人精品视频一区二区三区| 亚洲欧洲精品一区| 国语精品视频| 97精品在线视频| 久久久久国产精品嫩草影院| 亚洲一区二区三区四区在线| 色噜噜狠狠一区二区| 免费欧美激情| 91九色在线视频| 黄色软件视频在线观看| 欧美精品一区二区三区一线天视频| 三级黄色片在线观看| 久久一区视频| 91麻豆天美传媒在线| 亚洲精品成a人ⅴ香蕉片| 亚洲网址你懂得| 国产富婆一级全黄大片| 国产精品高清亚洲| 中文字幕人妻一区| 欧美a级理论片| 日本十八禁视频无遮挡| 精品无人区一区二区| 久久久久久亚洲精品不卡| 亚洲AV无码精品色毛片浪潮| 亚洲日穴在线视频| 一区二区不卡免费视频| 亚洲欧美成人综合| 一级全黄肉体裸体全过程| 婷婷成人av| 欧美最猛性xxxxx免费| 亚洲日本中文字幕在线| 亚洲va欧美va国产va天堂影院| 日本少妇xxx| 奇米四色…亚洲| 国模无码视频一区二区三区| 天堂俺去俺来也www久久婷婷| 久久久久久久成人| 欧美一区二区三区在线观看免费| 欧美熟乱第一页| 国产午夜性春猛交ⅹxxx| 91美女片黄在线观看| 国产91在线视频观看| 欧美男男gaytwinkfreevideos| 日本欧美一级片| 成年网站在线视频网站| 日韩禁在线播放| 国产高中女学生第一次| 亚洲国产视频网站| 免费成人深夜夜行网站| 国产乱子伦视频一区二区三区| av影院在线播放| 五月久久久综合一区二区小说| 91精品国产综合久久久久久丝袜| 污污视频在线| 大胆欧美人体视频| 午夜激情视频在线| 在线视频亚洲欧美| 春暖花开成人亚洲区| 欧美精品日日鲁夜夜添| 欧美成人免费观看视频| k8久久久一区二区三区| 亚洲国产精品久久久久爰色欲| 欧美综合视频| 日韩一区不卡| 欧美伦理影院| 日韩精品久久一区二区三区| 欧美日韩免费电影| 国产精品爽黄69| 国产资源一区| 成人综合国产精品| www.久久99| 亚洲综合日韩中文字幕v在线| 黑森林国产精品av| 57pao国产成人免费| 老司机在线视频二区| 精品国产麻豆免费人成网站| 久久精品久久久久久久| 亚洲欧美另类小说| 99热精品免费| 一二三四社区欧美黄| www亚洲色图| 国产精品女主播av| 青青草华人在线视频| av在线播放一区二区三区| 一区二区成人网| 久久精品国产网站| 天堂网成人在线| 国产精品白丝jk黑袜喷水| 黄色av免费在线播放| 欧美人成网站| 久在线观看视频| 日日夜夜精品视频天天综合网| 欧美精品久久久久久久久久久| 欧美色蜜桃97| av动漫免费观看| 欧美精品九九| 免费在线a视频| 免费高清在线一区| 国内精品国产三级国产aⅴ久| 天堂精品中文字幕在线| 国产曰肥老太婆无遮挡| 一区二区三区毛片免费| 日韩区国产区| 亚洲一区二区日韩| 男人添女人荫蒂免费视频| 女同性一区二区三区人了人一 | 51成人做爰www免费看网站| 另类中文字幕国产精品| 91精品国产高清自在线看超| av网站在线看| 91av国产在线| 日本成人在线网站| 国产一区喷水| 日韩欧美一区二区三区免费看| 麻豆视频成人| 亚洲蜜桃视频| 99蜜桃臀久久久欧美精品网站| 亚洲区欧美区| 日本一二区免费| 97精品久久久午夜一区二区三区| 91精品国产高清91久久久久久| 九九视频精品免费| 国产午夜在线一区二区三区| 国产精品1区2区3区| 久久久久久综合网| www国产亚洲精品久久麻豆| 成人免费无码大片a毛片| www.av精品| 99久久久免费精品| 91福利在线导航| 日本黄视频在线观看| 欧美www视频| 日本免费在线观看| 国产成人精品电影久久久| 日韩av超清在线观看| 日韩女在线观看| 91精品入口| 自拍偷拍一区二区三区| 欧美va天堂在线| 婷婷六月天在线| 91社区在线播放| 欧美黄色免费看| 欧美二区三区的天堂| av在线资源观看| 日韩在线欧美在线国产在线| 蜜桃av在线免费观看| 欧美成人小视频| 欧美国产视频| 日韩色妇久久av| 久久成人亚洲| 久久国产精品无码一级毛片| xfplay精品久久| 日韩av一二三区| 日韩精品一区二区三区老鸭窝 | 中文字幕精品网| 少妇视频一区| 久久艳妇乳肉豪妇荡乳av| 久久国产成人午夜av影院宅| 亚洲色图都市激情| 久久精品国产成人一区二区三区 | 日本高清久久久| 国产人久久人人人人爽| 五月天色婷婷丁香| 欧美日韩精品一区视频| www.色播.com| 久久精品中文字幕一区| jizz一区二区三区| 国产女人水真多18毛片18精品 | 国产suv精品一区二区33| 欧美军同video69gay| 日韩永久免费视频| 欧美激情图片区| ccyy激情综合| 六月丁香激情网| 久久久久国产精品免费免费搜索| 91久久国产综合| 91精品国产高清一区二区三区 | 久久网站热最新地址| 999精品视频在线观看播放| 五月婷婷欧美视频| 五月婷婷六月丁香| 欧美中文字幕精品| 欧美熟乱15p| 91欧美一区二区三区| 久久久久99精品一区| 久久久久久久久久久97| 欧美午夜精品一区二区蜜桃| 高h放荡受浪受bl| 国自在线精品视频| 免费久久久久久久久| 成年人看的毛片| 久久亚洲综合色一区二区三区| 青娱乐在线视频免费观看| 91久久香蕉国产日韩欧美9色| 午夜久久久久久久久久| 日韩性生活视频| 亚洲91网站| aa在线免费观看| 国产精品久久久久三级| 懂色av蜜臀av粉嫩av分享吧最新章节| 一个人www欧美| 国产日韩一区二区三免费高清 | 女主播福利一区| 国产又黄又粗又猛又爽的视频| 一区二区三区视频在线观看| 国产精品午夜一区二区| 日韩毛片中文字幕| 成人福利片在线| 成人性生活视频免费看| 国产一二精品视频| 国产成人无码精品久在线观看 | 红桃视频国产一区| 人妻丰满熟妇aⅴ无码| 午夜婷婷国产麻豆精品| 精品久久久久成人码免费动漫| x99av成人免费| 加勒比色老久久爱综合网| 黄色三级中文字幕| 国产色产综合产在线视频| 亚洲第一精品在线观看| 精品夜色国产国偷在线| 精精国产xxxx视频在线野外| 国产精品成人观看视频免费| 欧美激情综合色综合啪啪| 绯色av蜜臀vs少妇| 欧洲国内综合视频| av漫画网站在线观看| 久久久久久艹|