国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

跟妹妹聊到 Java 16 新特征,真香!

開(kāi)發(fā) 后端
2021年3月16日,甲骨文正式發(fā)布了Java 16!想當(dāng)年JDK1.6新出的場(chǎng)景和歷歷在目,一瞬間,版本已經(jīng)變成了16,真正體會(huì)了一把什么叫做光陰似箭,滄海桑田。雖然目前大部分的場(chǎng)合,Java8還占著主導(dǎo)地位,但我猜想各位Javaer應(yīng)該對(duì)Java16的新特性也大有興趣吧!

Java 16新特性


2021年3月16日,甲骨文正式發(fā)布了Java 16!想當(dāng)年JDK1.6新出的場(chǎng)景和歷歷在目,一瞬間,版本已經(jīng)變成了16,真正體會(huì)了一把什么叫做光陰似箭,滄海桑田。雖然目前大部分的場(chǎng)合,Java8還占著主導(dǎo)地位,但我猜想各位Javaer應(yīng)該對(duì)Java16的新特性也大有興趣吧!

看完之后我覺(jué)得這次更新還是很有意思的,我就精選幾個(gè)Java16的新特性,供大家一飽眼福!(大家可以自己建個(gè)項(xiàng)目用起來(lái)試試)

支持模式匹配的instanceof

想想你是怎么用instanceof的吧,一個(gè)例子:

  1. if (obj instanceof String) { 
  2.     String s = (String) obj;    // grr... 
  3.     ... 

這代碼是不是讓人蛋疼,我都知道是個(gè)String了,還讓我強(qiáng)轉(zhuǎn)一下,該改進(jìn)一下啦~

  1. if (obj instanceof String s) { 
  2.     //這里s隨你用了 從類(lèi)型判斷,到變量定義,類(lèi)型轉(zhuǎn)換,一氣呵成,爽不爽? 

進(jìn)一步的,還可以這么用,模式變量s在判斷條件里直接使用

  1. if (obj instanceof String s && s.length() > 5) { 
  2.     flag = s.contains("jdk"); 

不過(guò)要小心,下面的用法是錯(cuò)誤的(原因就不多解釋啦):

  1. if (obj instanceof String s || s.length() > 5) {    // Error! 
  2.     ... 

Records類(lèi)型

我們對(duì)Java最大的意見(jiàn)是啥?當(dāng)然是太繁瑣了,一個(gè)簡(jiǎn)單的功能,繁重的語(yǔ)法要整出好幾十行,不急,改進(jìn)這就來(lái)了,看看新的Recodes類(lèi)型吧!

假設(shè)你現(xiàn)在有這么一個(gè)類(lèi):


這是一個(gè)典型的不可變的數(shù)據(jù)對(duì)象,equals ()方法, hashCode()方法,toString()方法其實(shí)都是比較通用的。但是我們不得不為它多寫(xiě)那么幾行代碼。雖然有IDE的鼎力協(xié)助,但是看上去還是不怎么爽(如果沒(méi)有IDE,更要哭了)。不過(guò)沒(méi)事Records來(lái)了!用Records來(lái)表示上面的類(lèi),你只需要:

  1. record Point(int x, int y) { } 

是不是特別簡(jiǎn)單,感覺(jué)心里特別爽?record類(lèi)和普通的class不太一樣,它會(huì)幫你隱式生成一些字段和構(gòu)造函數(shù)。比如上面的record就會(huì)編譯成這樣:

  1. record Point(int x, int y) { 
  2.     // 隱式生成字段 
  3.     private final int x; 
  4.     private final int y; 
  5.     // 隱式生成構(gòu)造函數(shù),并帶上所有的參數(shù) 
  6.     Point(int x, int y) { 
  7.         this.x = x; 
  8.         this.y = y; 
  9.     } 

ZGC并發(fā)線程處理

ZGC是The Z Garbage Collector,是JDK 11中推出的一款低延遲垃圾回收器,它嘗試解決GC之痛,也就是停頓。

同時(shí),它也將面向以TB為單位的超大規(guī)模的內(nèi)存。在Java 16中,ZGC的線程棧處理的眾多操作,從檢查點(diǎn)移動(dòng)到了并發(fā)階段,這樣意味著停頓更小了。(后面準(zhǔn)備出個(gè)zgc相關(guān)的文章,順便測(cè)一波這次的停頓優(yōu)化時(shí)長(zhǎng))

彈性元空間

在Java虛擬機(jī)中,元空間用來(lái)保存一些類(lèi)的元信息,并且,元空間中的數(shù)據(jù)是可以被垃圾回收的。但不幸的是,空閑的未被使用的元空間并不會(huì)歸還給操作系統(tǒng),這就導(dǎo)致了內(nèi)存浪費(fèi)。

這個(gè)新特性就是為了解決這個(gè)問(wèn)題,它使得虛擬機(jī)可以從元空間中歸還未使用的內(nèi)存,從而更加有效得利用物理內(nèi)存。同時(shí)有一個(gè)新的虛擬機(jī)參數(shù)可以用來(lái)控制這種回收的執(zhí)行強(qiáng)度:-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)

Unix Domain套接字

Unix Domain套接字本身提供給了一套兼容于網(wǎng)絡(luò)編程,但是更加可靠、高效、安全的進(jìn)程間通信方式,它不需要經(jīng)過(guò)網(wǎng)絡(luò)協(xié)議棧,不需要打包拆包、計(jì)算校驗(yàn)和、維護(hù)序號(hào)和應(yīng)答等,只是將應(yīng)用層數(shù)據(jù)從一個(gè)進(jìn)程拷貝到另一個(gè)進(jìn)程。

在Java 16中,已經(jīng)可以直接使用這種套接字(Unix-domain (AF_UNIX),雖然叫做UNIX套接字,windows 10和Windows Server 2019也是可以使用的)了。為了支持Unix Domain套接字,新增了專門(mén)的java.net.UnixDomainSocketAddress類(lèi),下面看一下它的使用:

 

新的打包工具

提供了一個(gè)新的打包工具jpackage,用來(lái)打包獨(dú)立的Java應(yīng)用程序。這個(gè)工具可以生成windows上的exe和msi,MacOS上的pkg和dmg,以及l(fā)inux上的deb和rpm。它很好的給用戶提供了一鍵式安裝Java程序的好方法。

比如,對(duì)于非模塊化的應(yīng)用,可以這么打包:

  1. jpackage --name myapp --input lib --main-jar main.jar 
  2. 或者 直接指定main class 
  3. jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main 

對(duì)于模塊化的應(yīng)用:

  1. jpackage --name myapp --module-path lib -m myapp 
  2. 或者直接指定main class 
  3. jpackage --name myapp --module-path lib -m myapp/myapp.Main 

值對(duì)象錯(cuò)誤使用的警告

值對(duì)象,比如java.lang.Integer, java.lang.Double之類(lèi)的不變對(duì)象,在廢棄構(gòu)造函數(shù)的基礎(chǔ)上,進(jìn)一步標(biāo)記為forRemoval(不要再使用它們的構(gòu)造函數(shù)了哦!)。

同時(shí),如果在值對(duì)象上進(jìn)行同步,將會(huì)被警告,比如:

  1. Double d = 20.0; 
  2. synchronized (d) { ... } // javac和hotsopt都會(huì)警告 
  3. Object o = d; 
  4. synchronized (o) { ... } // HotSpot 會(huì)警告 

在虛擬機(jī)層面,還提供了參數(shù)可以在虛擬機(jī)層面控制報(bào)錯(cuò)行為:

  • -XX:DiagnoseSyncOnValueBasedClasses=1 將這種同步行為視為致命錯(cuò)誤
  • -XX:DiagnoseSyncOnValueBasedClasses=2 打開(kāi)日志,在控制臺(tái)和飛行記錄儀中記錄這種同步行為

默認(rèn)限制使用JDK內(nèi)部API

對(duì)于一些JDK內(nèi)部的API,作出了更嚴(yán)格的限制。比如 com.sun.*, jdk.*, and org.*這些包里的API,從Java 16開(kāi)始,默認(rèn)已經(jīng)禁止使用了。因此,鼓勵(lì)大家使用標(biāo)準(zhǔn)API,而不是內(nèi)部API(點(diǎn)擊這里查看可以替換的內(nèi)部API)。比如說(shuō)下面這句代碼,在Java 16中將報(bào)錯(cuò):

  1. System.out.println(sun.security.util.SecurityConstants.ALL_PERMISSION); 

錯(cuò)誤示例:

  1. Exception in thread "main" java.lang.IllegalAccessError: class Test 
  2.   (in unnamed module @0x5e481248) cannot access class 
  3.   sun.security.util.SecurityConstants (in module java.base) because 
  4.   module java.base does not export sun.security.util to unnamed 
  5.   module @0x5e481248 

同時(shí),JDK還提供--illegal-access參數(shù)用來(lái)控制對(duì)內(nèi)部API的使用:

  • --illegal-access=permit 允許使用內(nèi)部API
  • --illegal-access=warn 允許使用內(nèi)部API,不過(guò)每次使用會(huì)得到一個(gè)警告
  • --illegal-access=debug 允許使用內(nèi)部API,會(huì)更詳細(xì)的打印每一個(gè)錯(cuò)誤的調(diào)用堆棧,用它你就可以找到你在哪里有不正確的調(diào)用,就可以修復(fù)那些不合適的使用
  • --illegal-access=deny 禁止使用內(nèi)部API

孵化項(xiàng)目:向量API

我們知道,像Go這樣的后起之秀,已經(jīng)在內(nèi)部使用了AVX指令,性能飆升。Java在這方面也不甘示弱,在Java 16中,向量API作為一個(gè)孵化項(xiàng)目,允許我們直接使用SIMD指令來(lái)提高性能(如果有效使用,這波就帶你起飛了)。

讓我們先一睹為快吧!

下面是一個(gè)簡(jiǎn)單的標(biāo)量計(jì)算:

  1. void scalarComputation(float[] a, float[] b, float[] c) { 
  2.    for (int i = 0; i < a.length; i++) { 
  3.         c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f; 
  4.    } 

重點(diǎn)來(lái)了,使用AVX2帶你起飛:

  1. //256位的向量浮點(diǎn)運(yùn)算 
  2. static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256; 
  3.  
  4. void vectorComputation(float[] a, float[] b, float[] c) { 
  5.     int i = 0; 
  6.     int upperBound = SPECIES.loopBound(a.length); 
  7.     for (; i < upperBound; i += SPECIES.length()) { 
  8.         // FloatVector va, vb, vc; 
  9.         var va = FloatVector.fromArray(SPECIES, a, i); 
  10.         var vb = FloatVector.fromArray(SPECIES, b, i); 
  11.         var vc = va.mul(va). 
  12.                     add(vb.mul(vb)). 
  13.                     neg(); 
  14.         vc.intoArray(c, i); 
  15.     } 
  16.  
  17.     for (; i < a.length; i++) { 
  18.         c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f; 
  19.     } 

孵化項(xiàng)目:外部鏈接API

你是不是有抱怨過(guò)JNI太難用了?沒(méi)關(guān)系,JNI的進(jìn)化版來(lái)了,這就是外部鏈接器!它提供了一個(gè)靜態(tài)的,純Java的訪問(wèn)本地native 代碼的方法,它將極大簡(jiǎn)化我們調(diào)用本地代碼的過(guò)程。

新的API:

  • LibraryLookup::ofDefault:返回被JVM加載的庫(kù),可以看到所有這些庫(kù)的符號(hào)
  • LibraryLookup::ofPath:加載指定路徑
  • LibraryLookup::ofLibrary :根據(jù)庫(kù)名,加載庫(kù)

下面代碼展示了,使用Java調(diào)用clang庫(kù)中的clang_getClangVersion()方法:

  1. LibraryLookup libclang = LibraryLookup.ofLibrary("clang"); 
  2. LibraryLookup.Symbol clangVersion = libclang.lookup("clang_getClangVersion"); 

另外一個(gè)重要的類(lèi)是C鏈接器:

  1. interface CLinker { 
  2.     MethodHandle downcallHandle(LibraryLookup.Symbol func, 
  3.                                 MethodType type, 
  4.                                 FunctionDescriptor function); 
  5.     MemorySegment upcallStub(MethodHandle target, 
  6.                              FunctionDescriptor function); 

downcallHandle()表示在Java中調(diào)用本地方法;upcallStub()方法在native方法中調(diào)用java代碼。

下面的代碼展示了如何在Java代碼中,調(diào)用C函數(shù)size_t strlen(const char *s):

  1. MethodHandle strlen = CLinker.getInstance().downcallHandle( 
  2.         LibraryLookup.ofDefault().lookup("strlen"), 
  3.         MethodType.methodType(long.class, MemoryAddress.class), 
  4.         FunctionDescriptor.of(C_LONG, C_POINTER) 
  5.     ); 

上面代碼首先找到strlen符號(hào);然后描述它的簽名。最后使用downcallHandle()得到表示strlen()函數(shù)的MethodHandle對(duì)象;最后,就可以調(diào)用strlen()方法啦~

  1. try (MemorySegment str = CLinker.toCString("Hello")) { 
  2.    long len = strlen.invokeExact(str.address()); // 5 

反過(guò)來(lái),也可以把Java函數(shù)作為參數(shù)傳遞給C函數(shù)進(jìn)行回調(diào):

比如有一個(gè)C函數(shù):

  1. void qsort(void *base, size_t nmemb, size_t size
  2.            int (*compar)(const void *, const void *)); 

要調(diào)用這個(gè)C函數(shù),必須準(zhǔn)備一個(gè)函數(shù)指針compar,為了使用它,我們首先要得到它的MethodHandle:

  1. MethodHandle qsort = CLinker.getInstance().downcallHandle( 
  2.         LibraryLookup.ofDefault().lookup("qsort"), 
  3.         MethodType.methodType(void.class, MemoryAddress.class, long.class, 
  4.                               long.class, MemoryAddress.class), 
  5.         FunctionDescriptor.ofVoid(C_POINTER, C_LONG, C_LONG, C_POINTER) 
  6.     ); 

接著,用一個(gè)純Java類(lèi)來(lái)實(shí)現(xiàn)compar函數(shù):

  1. class Qsort { 
  2.     static int qsortCompare(MemoryAddress addr1, MemoryAddress addr2) { 
  3.             return MemoryAccess.getIntAtOffset(MemorySegment.ofNativeRestricted(),  
  4.                                                addr1.toRawLongValue()) -  
  5.                    MemoryAccess.getIntAtOffset(MemorySegment.ofNativeRestricted(), 
  6.                                                addr2.toRawLongValue()); 
  7.     } 

然后需要一個(gè)MethodHandle指向上述函數(shù):

  1. MethodHandle comparHandle 
  2.     = MethodHandles.lookup() 
  3.                    .findStatic(Qsort.class, "qsortCompare"
  4.                                MethodType.methodType(int.class, 
  5.                                                      MemoryAddress.class, 
  6.                                                      MemoryAddress.class)); 

然后,使用upcallStub()方法,得到一個(gè)函數(shù)指針(應(yīng)該說(shuō)是用Java描述的C函數(shù)指針):

  1. MemorySegment comparFunc 
  2.     = CLinker.getInstance().upcallStub(comparHandle, 
  3.                                             FunctionDescriptor.of(C_INT, 
  4.                                                                   C_POINTER, 
  5.                                                                   C_POINTER)); 
  6. ); 

最后,把這個(gè)"C函數(shù)指針"傳給C函數(shù):

  1. try (MemorySegment array = MemorySegment.allocateNative(4 * 10)) { 
  2.     array.copyFrom(MemorySegment.ofArray(new int[] { 0, 9, 3, 4, 6, 5, 1, 8, 2, 7 })); 
  3.     qsort.invokeExact(array.address(), 10L, 4L, comparFunc.address()); 
  4.     int[] sorted = array.toIntArray(); // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 

好了,這就是使用外部鏈接API來(lái)使用本地代碼的全過(guò)程,是不是很酷炫呢?

預(yù)覽功能:密封類(lèi)

類(lèi)的繼承是面向?qū)ο蟮囊粋€(gè)重要特性,但是濫用繼承對(duì)對(duì)象模型的建模也是非常不利的。對(duì)于這一點(diǎn),Java還有較大的改進(jìn)空間,密封類(lèi),正式對(duì)對(duì)象繼承的一種重大改進(jìn)。

首先,來(lái)看JDK內(nèi)部的一個(gè)例子:

  1. package java.lang; 
  2.  
  3. abstract class AbstractStringBuilder { ... } 
  4. public final class StringBuffer  extends AbstractStringBuilder { ... } 
  5. public final class StringBuilder extends AbstractStringBuilder { ... } 

AbstractStringBuilder有兩個(gè)子類(lèi)StringBuffer和StringBuilder。但是,我們的代碼卻無(wú)法繼承AbstractStringBuilder,因?yàn)锳bstractStringBuilder是包內(nèi)可見(jiàn)的,并不是public的。在很多場(chǎng)合,我們的對(duì)象模式其實(shí)并不希望徹底公開(kāi),我們有時(shí)候僅僅希望只有一些指定的類(lèi)可以繼承,而不是可以任由繼承擴(kuò)展。這就是密封類(lèi)的設(shè)計(jì)初衷。

密封類(lèi)/接口在聲明的時(shí)候,就可以指定哪些類(lèi)可以從這里繼承,比如:

  1. package com.example.geometry; 
  2.  
  3. public abstract sealed class Shape 
  4.     permits Circle, Rectangle, Square { ... } 

注意新關(guān)鍵字sealed,它表示被修飾的類(lèi)或者接口是密封的,緊接著使用permits關(guān)鍵字,指定哪些子類(lèi)可以繼承它,這里只有Circle,Rectangle和Square可以從Shape繼承(繼承類(lèi)和密封類(lèi)必須要在同一個(gè)模塊,如果在unamed模塊,就需要在同一個(gè)package)。

使用密封類(lèi),還有一些限制,比如:

1.子類(lèi)必須是直接繼承,而不是間接的

2.子類(lèi)必須說(shuō)明如果處理得到的密封屬性,三選一,必選一個(gè):

  • 子類(lèi)標(biāo)記為final,一了百了
  • 子類(lèi)也作為sealed類(lèi),并做有限的繼承擴(kuò)展
  • 子類(lèi)申明為non-sealed,公開(kāi)使用(這種情況,密封類(lèi)的初衷就被打破了,繼承關(guān)系就不可控了)

下面的代碼說(shuō)明了這3種情況:

  1. package com.example.geometry; 
  2. //使用final 
  3. public final class Circle extends Shape { ... } 
  4. //使用sealed 
  5. public sealed class Rectangle extends Shape  
  6.     permits TransparentRectangle, FilledRectangle { ... } 
  7. public final class TransparentRectangle extends Rectangle { ... } 
  8. public final class FilledRectangle extends Rectangle { ... } 
  9. //使用non-sealed 
  10. public non-sealed class Square extends Shape { ... } 

寫(xiě)在最后的話

看了那么多Java 16的新功能,心里是不是有點(diǎn)小激動(dòng)?不要猶豫了,下一個(gè)試試?

阿丙友情提示:不要在自己的項(xiàng)目中嘗試最新版本,等穩(wěn)定后再嘗試,可以在自己的demo和自己項(xiàng)目上嘗試。

我是敖丙,你知道的越多,不知道的越多,我們下期見(jiàn)。

責(zé)任編輯:姜華 來(lái)源: 三太子敖丙
相關(guān)推薦

2024-09-11 09:30:58

IDEA工具編程

2025-05-07 03:15:00

NacosAPIMCP

2024-12-26 08:34:32

2022-03-17 21:30:31

BRAS寬帶服務(wù)器

2020-07-02 14:30:12

SDNSDON交換機(jī)

2014-07-15 13:57:53

Java8

2024-01-08 08:44:06

2018-09-15 14:54:11

iPhone手機(jī)iPhone XR

2014-09-23 10:23:26

404 Not Fou谷歌

2025-08-26 02:25:00

2020-06-29 11:35:02

Spring BootJava腳手架

2014-04-16 07:48:56

Java 8Permgen

2022-05-31 09:17:08

通信網(wǎng)絡(luò)技術(shù)

2011-01-04 15:36:45

linux特征

2009-12-15 17:02:29

Vs.Net 2010

2012-05-16 11:03:50

微軟IIS

2019-10-31 15:37:29

Android Q

2022-08-26 16:13:56

iOS廣告安卓

2009-08-25 10:03:13

2022-05-17 11:48:06

谷歌賬號(hào)安全
點(diǎn)贊
收藏

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

成人黄色一级视频| 狠狠v欧美ⅴ日韩v亚洲v大胸| 久久久久久久久久伊人| 91亚洲精品在看在线观看高清| 综合久久一区二区三区| 8x8ⅹ国产精品一区二区二区| 久久99国产精一区二区三区| 精品日韩欧美一区二区| 在线视频三级| 亚洲欧洲日韩av| 免费看日本黄色| 亚洲精品视频啊美女在线直播| 美女福利精品视频| 欧洲性视频在线播放| 日本福利一区二区| 日韩写真福利视频在线| 精品国模一区二区三区欧美| 日韩经典一区二区三区| 69视频在线观看| 色婷婷av久久久久久久| 在线天堂av| 黑人与娇小精品av专区| 色视频www在线播放国产| 日韩毛片一二三区| 国产美女免费观看| 在线视频精品| 国产精品视频福利| 首页国产欧美久久| 天堂va久久久噜噜噜久久va| 麻豆国产精品视频| 国产精品无码电影在线观看| 久久伊人蜜桃av一区二区| 久久久久人妻精品一区三寸| 久久久久国产精品麻豆| av污在线观看| 亚洲成人自拍一区| 宅男网站在线免费观看| 精品成人a区在线观看| 青青青免费在线视频| 欧美激情视频给我| 久久亚洲精品中文字幕蜜潮电影| 97超级在线观看免费高清完整版电视剧| 在线精品一区| 亚洲精品久久久久久久蜜桃臀| 都市激情亚洲| 91亚洲人电影| 国产在线不卡一卡二卡三卡四卡| 欧美精品一区免费| 亚洲成人免费视| 男插女视频久久久| 5566成人精品视频免费| 激情婷婷久久| 能在线观看的av网站| 欧美精品久久久久久久多人混战 | 国产成人高清视频| 成人黄色网页| 一区二区三区视频免费在线观看| 欧美久久综合网| 少妇大叫太大太粗太爽了a片小说| 国产精品久久久99| 国产精品久久久久久久久免费高清 | 亚洲精品动态| 欧美一级二级三级| 亚洲一区二区三区三| 精品国产第一福利网站| 99久久国产免费免费| 国产日韩欧美制服另类| free性欧美| 91免费看网站| 专区另类欧美日韩| yiren22亚洲综合| 丝袜足脚交91精品| 欧美午夜影院在线视频| 久草成人资源| 成年在线播放小视频| 九九热精品在线| 国产麻豆精品在线| 黑森林国产精品av| 午夜啪啪福利视频| 精品粉嫩超白一线天av| 亚洲高清av| 天天综合视频在线观看| 成人在线视频电影| 日韩一区二区三区视频在线| 一区二区三区四区电影| 国内精品在线视频| 九九热久久66| 亚洲电影免费观看高清完整版在线观看 | 国产精品久久网站| 黑人一区二区三区| 精品久久一二三| 欧美精品videos性欧美| 99精品视频一区二区三区| 欧美爱爱视频| 免费看污黄网站| 国产在线精品播放| 91精品在线免费| 麻豆视频一区二区| 青青在线精品| 蜜桃视频在线观看视频| 久久综合九九| 久久五月情影视| 一区二区三区在线不卡| 欧美精品1区| 日韩不卡免费高清视频| a天堂中文在线官网| 亚洲国产精品123| 91在线云播放| 99久久婷婷| 日韩专区视频| 人人九九精品| 女人床在线观看| 国产日韩精品综合网站| 正在播放欧美一区| 午夜视频在线观看一区二区三区| 精品伊人久久久久7777人| 国模精品一区| 日本黄色免费在线| 欧美最顶级a∨艳星| 国产妇女馒头高清泬20p多| 91中文精品字幕在线视频| 自拍亚洲一区欧美另类| 欧美日韩国产一区二区三区地区| 久久久久久久久久久黄色| 久久永久免费| 亚洲影视一区二区三区| 久久99国内| 久本草在线中文字幕亚洲| 成人精品动漫| 女海盗2成人h版中文字幕| 在线播放av片| 黄网在线播放| 婷婷色播视频| 黄色高清无遮挡| 91黄色在线看| 今天免费高清在线观看国语| 亚洲韩国在线| 亚洲综合欧美日韩| 国产偷久久久精品专区| 成人激情春色网| 成人黄色短视频在线观看| 国产福利视频一区| 91精品久久久久久久久久久久久久| 欧美黄色www| 日韩网站在线观看| 日韩在线播放一区| 欧美激情18p| 久久免费精品日本久久中文字幕| 波霸ol色综合久久| 91精品国产777在线观看| 欧美亚洲成人网| 日韩av免费看| 91超碰rencao97精品| 欧美久久久久久| 男人添女人下部视频免费| 最近看过的日韩成人| aa在线观看视频| 色视频网站在线| 你懂的视频在线| 嗯~啊~轻一点视频日本在线观看| 亚洲美女尤物影院| 久久成人福利| 在线日本成人| 国产·精品毛片| 中文字幕精品一区二区精品绿巨人| 伊人开心综合网| 亚洲精品www久久久久久广东| 久久成人一区二区| 国产91亚洲精品一区二区三区| 亚洲欧洲一区二区在线观看| 中文字幕欧美人妻精品一区| 亚洲视频tv| 国产美女撒尿一区二区| 亚洲黄色成人| 成人午夜精品一区二区三区| 一本久久精品一区二区| 尤物九九久久国产精品的特点 | 精品国产一级| 老司机久久99久久精品播放免费| 国产精品国产三级国产aⅴ入口 | 国产99在线观看| 大胆日韩av| 成人av资源在线观看| 亚洲成人免费看| 麻豆乱码国产一区二区三区 | 亚洲成av人电影| 国产欧美一区二区三区网站| 在线播放一区二区三区| 欧美中文在线免费| av久久久久久| 久草在线视频资源| 真实国产乱子伦精品一区二区三区| 国产调教视频一区| 中文字幕在线日韩| 欧洲一区二区在线| 色综合久久影院| 亚洲激情女人| 91麻豆精品国产自产在线| 国产精品一区视频网站| 一本到av在线|