久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它

瀏覽:155日期:2023-09-23 08:08:16

最近 IDEA 2020最后一個(gè)版本發(fā)布了 ,已經(jīng)內(nèi)置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中內(nèi)置了Lombok依賴。為什么他們都要支持Lombok呢?今天我來(lái)講講Lombok的使用,看看它有何神奇之處!

Lombok簡(jiǎn)介

Lombok是一款Java代碼功能增強(qiáng)庫(kù),在Github上已有9.8k+Star。它會(huì)自動(dòng)集成到你的編輯器和構(gòu)建工具中,從而使你的Java代碼更加生動(dòng)有趣。通過(guò)Lombok的注解,你可以不用再寫(xiě)getter、setter、equals等方法,Lombok將在編譯時(shí)為你自動(dòng)生成。

Lombok集成

首先我們需要在IDEA中安裝好Lombok插件,如果你使用的是最新版IDEA 2020.3,則Lombok插件已經(jīng)內(nèi)置,無(wú)需安裝。

Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它

之后在項(xiàng)目的pom.xml文件中添加Lombok依賴,SpringBoot 2.1.x版本后無(wú)需指定Lombok版本,SpringBoot在 spring-boot-dependencies 中已經(jīng)內(nèi)置。

<!--lombok依賴--><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency>Lombok使用

Lombok中有很多注解,這些注解使得我們可以更加方便的編寫(xiě)Java代碼,下面介紹下這些注解的使用。

val

使用val注解可以取代任意類型作為局部變量,這樣我們就不用寫(xiě)復(fù)雜的ArrayList和Map.Entry類型了,具體例子如下。

/** * Created by macro on 2020/12/16. */public class ValExample { public static void example() { //val代替ArrayList<String>和String類型 val example = new ArrayList<String>(); example.add('Hello World!'); val foo = example.get(0); System.out.println(foo.toLowerCase()); } public static void example2() { //val代替Map.Entry<Integer,String>類型 val map = new HashMap<Integer, String>(); map.put(0, 'zero'); map.put(5, 'five'); for (val entry : map.entrySet()) { System.out.printf('%d: %sn', entry.getKey(), entry.getValue()); } } public static void main(String[] args) { example(); example2(); }}

當(dāng)我們使用了val注解后,Lombok會(huì)從局部變量的初始化表達(dá)式推斷出具體類型,編譯后會(huì)生成如下代碼。

public class ValExample { public ValExample() { } public static void example() { ArrayList<String> example = new ArrayList(); example.add('Hello World!'); String foo = (String)example.get(0); System.out.println(foo.toLowerCase()); } public static void example2() { HashMap<Integer, String> map = new HashMap(); map.put(0, 'zero'); map.put(5, 'five'); Iterator var1 = map.entrySet().iterator(); while(var1.hasNext()) { Entry<Integer, String> entry = (Entry)var1.next(); System.out.printf('%d: %sn', entry.getKey(), entry.getValue()); } }}

@NonNull

在方法上使用@NonNull注解可以做非空判斷,如果傳入空值的話會(huì)直接拋出NullPointerException。

/** * Created by macro on 2020/12/16. */public class NonNullExample { private String name; public NonNullExample(@NonNull String name){ this.name = name; } public static void main(String[] args) { new NonNullExample('test'); //會(huì)拋出NullPointerException new NonNullExample(null); }}

編譯后會(huì)在構(gòu)造器中添加非空判斷,具體代碼如下。

public class NonNullExample { private String name; public NonNullExample(@NonNull String name) { if (name == null) { throw new NullPointerException('name is marked non-null but is null'); } else { this.name = name; } } public static void main(String[] args) { new NonNullExample('test'); new NonNullExample((String)null); }}

@Cleanup

當(dāng)我們?cè)贘ava中使用資源時(shí),不可避免地需要在使用后關(guān)閉資源。使用@Cleanup注解可以自動(dòng)關(guān)閉資源。

/** * Created by macro on 2020/12/16. */public class CleanupExample { public static void main(String[] args) throws IOException { String inStr = 'Hello World!'; //使用輸入輸出流自動(dòng)關(guān)閉,無(wú)需編寫(xiě)try catch和調(diào)用close()方法 @Cleanup ByteArrayInputStream in = new ByteArrayInputStream(inStr.getBytes('UTF-8')); @Cleanup ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] b = new byte[1024]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } String outStr = out.toString('UTF-8'); System.out.println(outStr); }}

編譯后Lombok會(huì)生成如下代碼。

public class CleanupExample { public CleanupExample() { } public static void main(String[] args) throws IOException { String inStr = 'Hello World!'; ByteArrayInputStream in = new ByteArrayInputStream(inStr.getBytes('UTF-8')); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { byte[] b = new byte[1024]; while(true) { int r = in.read(b); if (r == -1) { String outStr = out.toString('UTF-8'); System.out.println(outStr); return; } out.write(b, 0, r); } } finally { if (Collections.singletonList(out).get(0) != null) { out.close(); } } } finally { if (Collections.singletonList(in).get(0) != null) { in.close(); } } }}

@Getter/@Setter

有了@Getter/@Setter注解,我們?cè)僖膊挥镁帉?xiě)getter/setter方法了。試想下之前即使我們使用IDEA自動(dòng)生成getter/setter方法,如果類屬性的類型和名稱改了,又要重新生成getter/setter方法也是一件很麻煩的事情。

/** * Created by macro on 2020/12/17. */public class GetterSetterExample { @Getter @Setter private String name; @Getter @Setter(AccessLevel.PROTECTED) private Integer age; public static void main(String[] args) { GetterSetterExample example = new GetterSetterExample(); example.setName('test'); example.setAge(20); System.out.printf('name:%s age:%d',example.getName(),example.getAge()); }}

編譯后Lombok會(huì)生成如下代碼。

public class GetterSetterExample { private String name; private Integer age; public GetterSetterExample() { } public String getName() { return this.name; } public void setName(final String name) { this.name = name; } public Integer getAge() { return this.age; } protected void setAge(final Integer age) { this.age = age; }}

@ToString

把所有類屬性都編寫(xiě)到toString方法中方便打印日志,是一件多么枯燥無(wú)味的事情。使用@ToString注解可以自動(dòng)生成toString方法,默認(rèn)會(huì)包含所有類屬性,使用@ToString.Exclude注解可以排除屬性的生成。

/** * Created by macro on 2020/12/17. */@ToStringpublic class ToStringExample { @ToString.Exclude private Long id; private String name; private Integer age; public ToStringExample(Long id,String name,Integer age){ this.id =id; this.name = name; this.age = age; } public static void main(String[] args) { ToStringExample example = new ToStringExample(1L,'test',20); //自動(dòng)實(shí)現(xiàn)toString方法,輸出ToStringExample(name=test, age=20) System.out.println(example); }}

編譯后Lombok會(huì)生成如下代碼。

public class ToStringExample { private Long id; private String name; private Integer age; public ToStringExample(Long id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public String toString() { return 'ToStringExample(name=' + this.name + ', age=' + this.age + ')'; }}

@EqualsAndHashCode

使用@EqualsAndHashCode注解可以自動(dòng)生成hashCode和equals方法,默認(rèn)包含所有類屬性,使用@EqualsAndHashCode.Exclude可以排除屬性的生成。

/** * Created by macro on 2020/12/17. */@Getter@Setter@EqualsAndHashCodepublic class EqualsAndHashCodeExample { private Long id; @EqualsAndHashCode.Exclude private String name; @EqualsAndHashCode.Exclude private Integer age; public static void main(String[] args) { EqualsAndHashCodeExample example1 = new EqualsAndHashCodeExample(); example1.setId(1L); example1.setName('test'); example1.setAge(20); EqualsAndHashCodeExample example2 = new EqualsAndHashCodeExample(); example2.setId(1L); //equals方法只對(duì)比id,返回true System.out.println(example1.equals(example2)); }}

編譯后Lombok會(huì)生成如下代碼。

public class EqualsAndHashCodeExample { private Long id; private String name; private Integer age; public EqualsAndHashCodeExample() { } public boolean equals(final Object o) { if (o == this) { return true; } else if (!(o instanceof EqualsAndHashCodeExample)) { return false; } else { EqualsAndHashCodeExample other = (EqualsAndHashCodeExample)o; if (!other.canEqual(this)) { return false; } else { Object this$id = this.getId(); Object other$id = other.getId(); if (this$id == null) { if (other$id != null) { return false; } } else if (!this$id.equals(other$id)) { return false; } return true; } } } protected boolean canEqual(final Object other) { return other instanceof EqualsAndHashCodeExample; } public int hashCode() { int PRIME = true; int result = 1; Object $id = this.getId(); int result = result * 59 + ($id == null ? 43 : $id.hashCode()); return result; }}

@XxConstructor

使用@XxConstructor注解可以自動(dòng)生成構(gòu)造方法,有@NoArgsConstructor、@RequiredArgsConstructor和@AllArgsConstructor三個(gè)注解可以使用。

@NoArgsConstructor:生成無(wú)參構(gòu)造函數(shù)。 @RequiredArgsConstructor:生成包含必須參數(shù)的構(gòu)造函數(shù),使用@NonNull注解的類屬性為必須參數(shù)。 @AllArgsConstructor:生成包含所有參數(shù)的構(gòu)造函數(shù)。

/** * Created by macro on 2020/12/17. */@NoArgsConstructor@RequiredArgsConstructor(staticName = 'of')@AllArgsConstructorpublic class ConstructorExample { @NonNull private Long id; private String name; private Integer age; public static void main(String[] args) { //無(wú)參構(gòu)造器 ConstructorExample example1 = new ConstructorExample(); //全部參數(shù)構(gòu)造器 ConstructorExample example2 = new ConstructorExample(1L,'test',20); //@NonNull注解的必須參數(shù)構(gòu)造器 ConstructorExample example3 = ConstructorExample.of(1L); }}

編譯后Lombok會(huì)生成如下代碼。

public class ConstructorExample { @NonNull private Long id; private String name; private Integer age; public ConstructorExample() { } private ConstructorExample(@NonNull final Long id) { if (id == null) { throw new NullPointerException('id is marked non-null but is null'); } else { this.id = id; } } public static ConstructorExample of(@NonNull final Long id) { return new ConstructorExample(id); } public ConstructorExample(@NonNull final Long id, final String name, final Integer age) { if (id == null) { throw new NullPointerException('id is marked non-null but is null'); } else { this.id = id; this.name = name; this.age = age; } }}

@Data

@Data是一個(gè)方便使用的組合注解,是@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor的組合體。

/** * Created by macro on 2020/12/17. */@Datapublic class DataExample { @NonNull private Long id; @EqualsAndHashCode.Exclude private String name; @EqualsAndHashCode.Exclude private Integer age; public static void main(String[] args) { //@RequiredArgsConstructor已生效 DataExample example1 = new DataExample(1L); //@Getter @Setter已生效 example1.setName('test'); example1.setAge(20); //@ToString已生效 System.out.println(example1); DataExample example2 = new DataExample(1L); //@EqualsAndHashCode已生效 System.out.println(example1.equals(example2)); }}

編譯后Lombok會(huì)生成如下代碼。

public class DataExample { @NonNull private Long id; private String name; private Integer age; public DataExample(@NonNull final Long id) { if (id == null) { throw new NullPointerException('id is marked non-null but is null'); } else { this.id = id; } } @NonNull public Long getId() { return this.id; } public String getName() { return this.name; } public Integer getAge() { return this.age; } public void setId(@NonNull final Long id) { if (id == null) { throw new NullPointerException('id is marked non-null but is null'); } else { this.id = id; } } public void setName(final String name) { this.name = name; } public void setAge(final Integer age) { this.age = age; } public boolean equals(final Object o) { if (o == this) { return true; } else if (!(o instanceof DataExample)) { return false; } else { DataExample other = (DataExample)o; if (!other.canEqual(this)) { return false; } else { Object this$id = this.getId(); Object other$id = other.getId(); if (this$id == null) { if (other$id != null) { return false; } } else if (!this$id.equals(other$id)) { return false; } return true; } } } protected boolean canEqual(final Object other) { return other instanceof DataExample; } public int hashCode() { int PRIME = true; int result = 1; Object $id = this.getId(); int result = result * 59 + ($id == null ? 43 : $id.hashCode()); return result; } public String toString() { return 'DataExample(id=' + this.getId() + ', name=' + this.getName() + ', age=' + this.getAge() + ')'; }}

@Value

使用@Value注解可以把類聲明為不可變的,聲明后此類相當(dāng)于final類,無(wú)法被繼承,其屬性也會(huì)變成final屬性。

/** * Created by macro on 2020/12/17. */@Valuepublic class ValueExample { private Long id; private String name; private Integer age; public static void main(String[] args) { //只能使用全參構(gòu)造器 ValueExample example = new ValueExample(1L,'test',20); // example.setName('andy') //沒(méi)有生成setter方法,會(huì)報(bào)錯(cuò) // example.name='andy' //字段被設(shè)置為final類型,會(huì)報(bào)錯(cuò) }}

編譯后Lombok會(huì)生成如下代碼。

public final class ValueExample { private final Long id; private final String name; private final Integer age; public static void main(String[] args) { new ValueExample(1L, 'test', 20); } public ValueExample(final Long id, final String name, final Integer age) { this.id = id; this.name = name; this.age = age; } public Long getId() { return this.id; } public String getName() { return this.name; } public Integer getAge() { return this.age; }}

@Builder

使用@Builder注解可以通過(guò)建造者模式來(lái)創(chuàng)建對(duì)象,建造者模式加鏈?zhǔn)秸{(diào)用,創(chuàng)建對(duì)象太方便了!

/** * Created by macro on 2020/12/17. */@Builder@ToStringpublic class BuilderExample { private Long id; private String name; private Integer age; public static void main(String[] args) { BuilderExample example = BuilderExample.builder() .id(1L) .name('test') .age(20) .build(); System.out.println(example); }}

編譯后Lombok會(huì)生成如下代碼。

public class BuilderExample { private Long id; private String name; private Integer age; BuilderExample(final Long id, final String name, final Integer age) { this.id = id; this.name = name; this.age = age; } public static BuilderExample.BuilderExampleBuilder builder() { return new BuilderExample.BuilderExampleBuilder(); } public String toString() { return 'BuilderExample(id=' + this.id + ', name=' + this.name + ', age=' + this.age + ')'; } public static class BuilderExampleBuilder { private Long id; private String name; private Integer age; BuilderExampleBuilder() { } public BuilderExample.BuilderExampleBuilder id(final Long id) { this.id = id; return this; } public BuilderExample.BuilderExampleBuilder name(final String name) { this.name = name; return this; } public BuilderExample.BuilderExampleBuilder age(final Integer age) { this.age = age; return this; } public BuilderExample build() { return new BuilderExample(this.id, this.name, this.age); } public String toString() { return 'BuilderExample.BuilderExampleBuilder(id=' + this.id + ', name=' + this.name + ', age=' + this.age + ')'; } }}

@SneakyThrows

還在手動(dòng)捕獲并拋出異常?使用@SneakyThrows注解自動(dòng)實(shí)現(xiàn)試試!

/** * Created by macro on 2020/12/17. */public class SneakyThrowsExample { //自動(dòng)拋出異常,無(wú)需處理 @SneakyThrows(UnsupportedEncodingException.class) public static byte[] str2byte(String str){ return str.getBytes('UTF-8'); } public static void main(String[] args) { String str = 'Hello World!'; System.out.println(str2byte(str).length); }}

編譯后Lombok會(huì)生成如下代碼。

public class SneakyThrowsExample { public SneakyThrowsExample() { } public static byte[] str2byte(String str) { try { return str.getBytes('UTF-8'); } catch (UnsupportedEncodingException var2) { throw var2; } }}

@Synchronized

當(dāng)我們?cè)诙鄠€(gè)線程中訪問(wèn)同一資源時(shí),往往會(huì)出現(xiàn)線程安全問(wèn)題,以前我們往往使用synchronized關(guān)鍵字修飾方法來(lái)實(shí)現(xiàn)同步訪問(wèn)。使用@Synchronized注解同樣可以實(shí)現(xiàn)同步訪問(wèn)。

package com.macro.mall.tiny.example;import lombok.*;/** * Created by macro on 2020/12/17. */@Datapublic class SynchronizedExample { @NonNull private Integer count; @Synchronized @SneakyThrows public void reduceCount(Integer id) { if (count > 0) { Thread.sleep(500); count--; System.out.println(String.format('thread-%d count:%d', id, count)); } } public static void main(String[] args) { //添加@Synchronized三個(gè)線程可以同步調(diào)用reduceCount方法 SynchronizedExample example = new SynchronizedExample(20); new ReduceThread(1, example).start(); new ReduceThread(2, example).start(); new ReduceThread(3, example).start(); } @RequiredArgsConstructor static class ReduceThread extends Thread { @NonNull private Integer id; @NonNull private SynchronizedExample example; @Override public void run() { while (example.getCount() > 0) { example.reduceCount(id); } } }}

編譯后Lombok會(huì)生成如下代碼。

public class SynchronizedExample { private final Object $lock = new Object[0]; @NonNull private Integer count; public void reduceCount(Integer id) { try { synchronized(this.$lock) { if (this.count > 0) { Thread.sleep(500L); Integer var3 = this.count; Integer var4 = this.count = this.count - 1; System.out.println(String.format('thread-%d count:%d', id, this.count)); } } } catch (Throwable var7) { throw var7; } }}

@With

使用@With注解可以實(shí)現(xiàn)對(duì)原對(duì)象進(jìn)行克隆,并改變其一個(gè)屬性,使用時(shí)需要指定全參構(gòu)造方法。

@With@AllArgsConstructorpublic class WithExample { private Long id; private String name; private Integer age; public static void main(String[] args) { WithExample example1 = new WithExample(1L, 'test', 20); WithExample example2 = example1.withAge(22); //將原對(duì)象進(jìn)行clone并設(shè)置age,返回false System.out.println(example1.equals(example2)); }}

編譯后Lombok會(huì)生成如下代碼。

public class WithExample { private Long id; private String name; private Integer age; public WithExample withId(final Long id) { return this.id == id ? this : new WithExample(id, this.name, this.age); } public WithExample withName(final String name) { return this.name == name ? this : new WithExample(this.id, name, this.age); } public WithExample withAge(final Integer age) { return this.age == age ? this : new WithExample(this.id, this.name, age); } public WithExample(final Long id, final String name, final Integer age) { this.id = id; this.name = name; this.age = age; }}

@Getter(lazy=true)

當(dāng)我們獲取某一個(gè)屬性比較消耗資源時(shí),可以給@Getter添加 lazy=true 屬性實(shí)現(xiàn)懶加載,會(huì)生成Double Check Lock 樣板代碼對(duì)屬性進(jìn)行懶加載。

/** * Created by macro on 2020/12/17. */public class GetterLazyExample { @Getter(lazy = true) private final double[] cached = expensive(); private double[] expensive() { double[] result = new double[1000000]; for (int i = 0; i < result.length; i++) { result[i] = Math.asin(i); } return result; } public static void main(String[] args) { //使用Double Check Lock 樣板代碼對(duì)屬性進(jìn)行懶加載 GetterLazyExample example = new GetterLazyExample(); System.out.println(example.getCached().length); }}

編譯后Lombok會(huì)生成如下代碼。

public class GetterLazyExample { private final AtomicReference<Object> cached = new AtomicReference(); public GetterLazyExample() { } private double[] expensive() { double[] result = new double[1000000]; for(int i = 0; i < result.length; ++i) { result[i] = Math.asin((double)i); } return result; } public double[] getCached() { Object value = this.cached.get(); if (value == null) { synchronized(this.cached) { value = this.cached.get(); if (value == null) { double[] actualValue = this.expensive(); value = actualValue == null ? this.cached : actualValue; this.cached.set(value); } } } return (double[])((double[])(value == this.cached ? null : value)); }}

@Log

使用@Log注解,可以直接生成日志對(duì)象log,通過(guò)log對(duì)象可以直接打印日志。

/** * Created by macro on 2020/12/17. */@Logpublic class LogExample { public static void main(String[] args) { log.info('level info'); log.warning('level warning'); log.severe('level severe'); }}

編譯后Lombok會(huì)生成如下代碼。

public class LogExample { private static final Logger log = Logger.getLogger(LogExample.class.getName()); public LogExample() { } public static void main(String[] args) { log.info('level info'); log.warning('level warning'); log.severe('level severe'); }}

@Slf4j

使用Lombok生成日志對(duì)象時(shí),根據(jù)使用日志實(shí)現(xiàn)的不同,有多種注解可以使用。比如@Log、@Log4j、@Log4j2、@Slf4j等。

/** * Created by macro on 2020/12/17. */@Slf4jpublic class LogSlf4jExample { public static void main(String[] args) { log.info('level:{}','info'); log.warn('level:{}','warn'); log.error('level:{}', 'error'); }}

編譯后Lombok會(huì)生成如下代碼。

public class LogSlf4jExample { private static final Logger log = LoggerFactory.getLogger(LogSlf4jExample.class); public LogSlf4jExample() { } public static void main(String[] args) { log.info('level:{}', 'info'); log.warn('level:{}', 'warn'); log.error('level:{}', 'error'); }}Lombok原理

如果IDEA不安裝Lombok插件的話,我們打開(kāi)使用Lombok的項(xiàng)目是無(wú)法通過(guò)編譯的。裝了以后IDEA才會(huì)提示我們Lombok為我們生成的方法和屬性。

使用了@Data注解以后,查看類結(jié)構(gòu)可以發(fā)現(xiàn)getter、setter、toString等方法。

Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它

打開(kāi)target目錄下的 .class 文件,我們可以看到Lombok為我們生成的代碼,可見(jiàn)Lombok是通過(guò)解析注解,然后在編譯時(shí)生成代碼來(lái)實(shí)現(xiàn)Java代碼的功能增強(qiáng)的。

Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它

參考資料

官方文檔:https://projectlombok.org/features/all

項(xiàng)目源碼地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-lombok

到此這篇關(guān)于Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它的文章就介紹到這了,更多相關(guān)Lombok SpringBoot和IDEA內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲第一福利视频 | 久久久国产精品 | 久久久一区二区 | 日韩精品视频在线播放 | 99精品视频在线 | 日韩av一级片 | 中文字幕7777 | 久久久99精品免费观看 | 美女视频黄a | 91在线精品视频 | 精品免费国产一区二区三区 | 九九久久精品 | 国产91亚洲 | 成人精品一区二区三区中文字幕 | 日韩大片免费播放 | 后人极品翘臀美女在线播放 | 黄色片免费 | 欧美 国产精品 | 日本阿v视频高清在线中文 中文二区 | 无码日韩精品一区二区免费 | 日韩精品 电影一区 亚洲 | www.啪啪 | 中文字幕一二三区 | 日韩中出 | 欧美精品久久久 | 日韩中文字幕 | 国产精品视频播放 | 国产精品不卡 | 国产一区二区三区在线看 | 国产精品综合视频 | 国内精品一区二区 | 国产精品久久久久久久 | 久久综合九色综合欧美狠狠 | 男女18免费网站视频 | 久久久亚洲精品中文字幕 | 免费一区 | 中文字幕观看 | 久久一区二区三区四区 | 懂色一区二区三区av片 | 九九免费视频 | 国产精品中文字幕在线 | 日韩成人在线播放 | 成人天堂噜噜噜 | 日韩欧美a级v片免费播放 | 亚洲精品一区国语对白 | 免费二区| 久久aⅴ国产欧美74aaa | 亚洲国产精品一区二区久久 | 韩日免费视频 | 精品日韩一区二区三区 | 久久久蜜桃 | 欧美精品综合在线 | 亚洲福利一区 | 欧美另类综合 | 一区不卡| 国产视频精品一区二区三区 | 欧洲精品久久久 | 一区二区三区视频免费在线观看 | 日韩电影一区二区在线观看 | 日韩精品一区二 | 久草免费在线视频 | 精品久久久久久久人人人人传媒 | 狠狠爱综合 | 色综合天天综合网国产成人网 | 日韩3级 | 国产精国产精品 | cao视频| 精品国产乱码一区二区三区 | 动漫羞免费网站中文字幕 | 亚洲香蕉视频 | jlzzjlzz亚洲日本少妇 | av一区二区在线观看 | 中国一级特黄毛片大片 | 久操伊人 | 欧洲一区二区在线观看 | 国产精彩视频 | 黄色电影天堂 | 亚洲精品18 | 国产第99页| 亚洲免费人成在线视频观看 | 国产精品女人视频 | av一区二区在线观看 | 亚洲三区在线观看 | 午夜影院在线观看 | 性视频一区二区 | 91精品在线播放 | 欧美 日韩 国产 一区 | 国产精品a久久久久 | 久久精品一区二区三区四区 | 婷婷毛片 | 国产高清一区 | 蜜桃官网 | 久久99国产精品免费网站 | 亚洲精品一区二区三区蜜桃下载 | 亚洲综合色自拍一区 | 国产伦精品一区二区三区四区视频 | 日韩欧美一级在线 | 久久精品黄色 | 四虎中文字幕 | 超碰在线99| 亚洲精品v | 黄p在线看 | 一级视频网站 | 欧美激情在线免费观看 | 亚洲综合视频 | a视频在线观看 | 欧美第一色| 99在线视频精品 | 午夜精品久久久久久久 | 日本不卡免费新一二三区 | 国产精品久久久久久久久久免费 | 亚洲天堂成人在线 | 国内精品一区二区三区视频 | 亚洲看片 | 真实国产露脸乱 | 极品久久| 中文字幕在线导航 | 91精品国产欧美一区二区成人 | 欧美日韩福利视频 | 在线观看国产视频 | 国产激情性色视频在线观看 | 国产精品视频网站 | 午夜看片 | 国产情侣激情 | 欧美日本免费一区二区三区 | 蜜臀av在线播放一区二区三区 | 日日操夜 | 亚洲欧美一区二区三区久久 | 91精品久久久久久久久久久久久久久 | 精品国产免费久久久久久尖叫 | 日韩中文字幕在线看 | 久久99精品国产99久久6男男 | 欧美jizzhd精品欧美巨大免费 | 成人亚洲天堂 | 日韩高清不卡一区二区三区 | 中文字幕亚洲一区二区三区 | 女人毛片 | 午夜精品久久久久久99热软件 | 99久久婷婷国产综合精品电影 | 精品成人一区二区 | 日日干天天操 | 国外成人在线视频网站 | 成人在线视频免费 | 亚洲成人av | 欧美日韩中字 | 国产精品久久久久一区二区三区 | 欧美日韩精品在线观看 | 香蕉久久夜色精品国产使用方法 | 99精品国产一区二区三区 | 久久综合久久综合久久 | 久久国产成人 | 国产第一页在线播放 | 先锋影音在线观看 | 搡女人真爽免费午夜网站 | 国产激情在线观看视频 | 91中文字幕| 久久艹久久 | 日韩在线播放一区 | 国产综合久久久久久鬼色 | 精品国产黄a∨片高清在线 激情网站免费 | 亚洲国产精品99久久久久久久久 | 久久国产一区二区三区 | 欧美成人免费一级人片100 | 亚洲一区二区三区欧美 | 日本黄色片免费看 | 精品一区二区三区国产 | 午夜精品一区二区三区免费视频 | 91精品国产综合久久久久久丝袜 | 精品国产髙清在线看国产毛片 | 国产一区二区三区91 | 国产精品伦理一区 | 国产精品成人一区二区 | 国产精品久久久久久久久久妇女 | 日本韩国欧美一区 | 国产毛片av | 欧美精品一区二区久久 | 黑色丝袜脚足j国产在线看68 | 亚洲第一黄色 | 欧美视频在线一区 | 国产成人午夜 | 99精品国产热久久91蜜凸 | 色婷婷综合久久久久中文一区二区 | 999国产| 亚洲精品片 | 日韩中文字幕在线播放 | 99久久精品免费看国产四区 | 久久草草影视免费网 | 最新精品在线 | 日韩aaa久久蜜桃av | 欧美天堂 | 精品中文字幕一区二区 | 毛片视频网站 | 国产超碰人人模人人爽人人添 | 国产欧美综合一区 | 欧美精品中文字幕久久二区 | 久久久久久成人 | 国产一区二区三区精品久久久 | 亚洲视频二区 | 波多野结衣福利电影 | 91中文 | 欧美综合久久 | 天天色天天看 | 久久久久久久久99精品 | 91精彩视频在线观看 | 色www精品视频在线观看 | 免费观看成人性生生活片 | 国产视频福利在线观看 | 波多野结衣一区二区三区高清 | 啪啪的网站 | 亚洲综合网站 | 伊人网站 | av香港经典三级级 在线 | 久久久av亚洲男天堂 | 7878www免费看片 | 国产丝袜一区 | 亚洲视频一区二区 | 亚洲欧美v国产一区二区 | 日本一级淫片免费看 | 亚洲欧美日韩在线 | 欧美激情视频一区二区三区 | 草久网 | 欧美综合久久 | 日韩视频在线免费观看 | 成人亚洲精品777777大片 | 奇米色欧美一区二区三区 | 91精品久久久久久久久久 | xx视频在线观看 | 欧州一区二区 | 精品久久久久久久久久久久 | 国产精品永久免费 | 天堂一区二区三区 | 亚洲片在线观看 | 日日摸天天做天天添天天欢 | 午夜国产在线 | 日韩精品一区二区三区中文在线 | 欧美一区中文字幕 | 欧美一区二区在线播放 | 国产xxxx成人精品免费视频频 | 国产精品久久久久久久久久久免费看 | 中文字幕第二十六页页 | 日韩中文字幕免费观看 | 亚洲成人一区二区 | 免费国产视频 | 伊人网站 | 欧美日韩一区二区三区 | 亚洲三区电影 | 日韩精品第一页 | 亚洲网站在线播放 | 欧美在线操 | 国产九九精品视频 | 日韩精品一区二 | 日本精品一区二区三区视频 | 国产福利91精品一区二区 | 视频一区在线播放 | 国产成人精品免费视频大全最热 | 欧美一级视频免费 | 一区二区免费在线 | 国产精品久久九九 | 久久亚洲国产精品日日av夜夜 | 综合久久精品 | 国产精品一区二区三区四区五区 | 日产精品久久久一区二区 | 亚洲电影在线观看 | 欧美亚洲一区 | 成年人黄色一级片 | 国产精品一区二区三区99 | 嫩草视频入口 | 午夜精品久久久久久久久久久久久 | 五月在线视频 | 在线成人| 中文字幕一区二区三区不卡 | 中文字幕99| 91亚洲高清| 成人欧美一区二区三区色青冈 | 在线中文字幕视频 | 精品成人免费一区二区在线播放 | 色婷婷一区二区三区四区 | 欧美精品理论片大全 | 久久精品欧美一区二区三区不卡 | 久久天堂 | 91看片网站 | 经典法国性xxxx精品 | av国产精品 | 欧美午夜一区二区三区免费大片 | 久久爱综合 | 在线视频自拍 | 国产一区二区三区欧美 | 亚洲精品久久久久久一区二区 | 综合久久99 | 国产成人精品一区二区三区视频 | av在线免费观看网站 | 欧美一区精品 | 成人精品国产 | 久久99精品国产自在现线 | 国产精品91久久久久 | 国产成人精品久久二区二区91 | 午夜免费视频 | 亚洲一区 中文字幕 | 国产欧美日本 | 国产精品自产av一区二区三区 | 亚洲精品久久久一区二区三区 | 亚洲毛片网站 | www.fefe66.com| 久久叉| 狠狠干天天干 | 91一区二区 | 在线国产视频 | 亚洲综合电影 | 激情网站免费 | 中文av字幕 | 91原创视频在线观看 | 亚洲精品久久 | 毛片大全 | av第一页| 伊人伊人网 | 99精品免费| 成人一级毛片 | 日韩欧美精品在线 | 男人的天堂久久精品 | 欧美日韩在线免费观看 | 天天干天天摸 | 九九热精 | www.久久| 精品一区二区三区国产 | 精品96久久久久久中文字幕无 | 综合一区二区三区 | 精品成人在线视频 | 欧美国产日韩在线 | 青青草超碰在线 | 亚洲午夜精品片久久www慈禧 | 国产高清视频在线 | 亚洲乱码二区 | 日韩一二区视频 | 免费在线亚洲 | 在线观看av网站永久 | 久草成人网 | 精品在线一区二区三区 | 亚洲欧美一区二区精品中文字幕 | 日本视频在线 | 亚洲综合欧美日韩 | 日韩av免费看 | 日韩在线视频一区 | 亚洲视频一区 | 五月天电影网 | 50人群体交乱视频 | 国产成人欧美一区二区三区的 | 精品国产乱码久久久久久丨区2区 | 亚洲午夜精品一区二区三区他趣 | 97精品国产| 欧美亚洲国产一区二区三区 | 午夜精品久久久久久久久久久久 | 国产精品久久免费视频在线 | 亚洲欧洲日本国产 | 国产精品二区三区在线观看 | 精品久久一区二区三区 | 偷派自拍 | 欧美亚洲性视频 | 亚洲日韩aⅴ在线视频 | 日韩精品一二三区 | 午夜a v电影 | 一级一级一级毛片 | 午夜国产影院 | 三区在线观看 | 国产片久久 | 午夜精品久久久久 | 噜噜噜噜狠狠狠7777视频 | 国产综合久久久久久鬼色 | 一级毛片观看 | 一区中文字幕 | 欧州一区二区 | 欧美日黄 | 亚洲黄色免费观看 | 国产精品毛片无码 | 91视频观看 | 久久精品国产99精品国产亚洲性色 | 日韩在线一区二区 | 在线精品日韩 | 日本不卡一区二区 | 久久99国产伦子精品免费 | 日韩国产精品一区二区三区 | 午夜影院在线观看版 | 红桃av一区二区 | 久久伦理电影网 | 国产高清精品在线 | 在线观看日韩 | 天堂资源在线 | 亚洲 精品 综合 精品 自拍 | 亚洲理论电影在线观看 | 视频一区二区三区在线观看 | 91精品久久久久久久久久 | 亚洲国产高清视频 | 黄色短视频在线观看 | 中文字幕精品视频在线观看 | 欧美性一区二区 | 国产精品久久久久无码av | 香蕉视频在线看 | 高清一区二区三区 | 国产在线高清 | 欧美国产91| 亚洲免费视频观看 | 最新超碰 | 国产综合视频在线观看 | 2018天天操夜夜操 | 日本亚洲欧美 | www97影院 | 欧美午夜精品久久久久久浪潮 | 99re热精品视频 | 中文字幕国产区 | 亚洲成人一区二区 | 精品一区二区视频 | 99在线视频观看 | 日韩不卡一区二区 | 久久久国产精品视频 | 一级做a爰片性色毛片 | 99精品欧美一区二区三区 | 一级黄色录像免费观看 | 亚洲不卡在线观看 | 一区二区影视 | 精品亚洲一区二区 | 亚洲久草在线 | 亚洲国产久 | 一级片大全 | 日韩欧美精品一区二区三区 | 亚洲第一免费视频网站 | 久久99精品视频 | 一区二区三区在线免费播放 | 日本三级电影网站 | 国产伦精品一区二区三区在线 | 国产资源在线观看 | 国产一区二区精品 | 韩国精品 | 日韩精品中文字幕一区二区三区 | 日本免费在线视频 | 国产一区二区三区久久久久久久久 | 999久久久国产精品 免费视频一区 | 成人看片在线 | 理论片一区| 欧美日韩激情 | 伊人天天操 | 天堂中文网 | 97碰碰碰免费公开在线视频 | 欧美高清一区 | 亚洲成人精品一区 | 欧美午夜一区二区福利视频 | 国产一区二区三区在线 | 天堂成人av| 一区二区色 | 黄色片网站在线观看 | 久久精品国产精品亚洲 | 成人精品国产 | 国产无区一区二区三麻豆 | 成人日批视频 | 一级黄色大片视频 | 在线国产91 | 一区二区精品在线 | 久久久久久99| 国产在线一区二区 | 91国内精品久久 | 九九九九九九精品任你躁 | 欧美在线视频一区 | 成人黄色免费 | 婷婷免费在线观看 | 激情久久久 | 中文字幕电影在线 | 国产伦精品一区二区三区高清 | 久久久久无码国产精品一区 | 狠狠插天天干 | 国产午夜精品久久久久久久 | 国内精品久久久久久影视8 91一区二区在线观看 | 欧美一级做性受免费大片免费 | 中文字幕一区二区三区四区 | 视频在线一区二区 | 99免费视频 | 麻豆一区二区三区 | 亚洲午夜一区 | 色婷婷国产精品综合在线观看 | 九九精品免费视频 | 午夜影院免费观看 | 四色成人av永久网址 | 亚洲国产高清高潮精品美女 | www.日韩在线观看 | 国产视频久久久 | 91精品久久久久久久久久入口 | а天堂中文最新一区二区三区 | 久久久免费视频看看 | 黄色一级免费观看 | 国产91黄色| 噜噜噜噜狠狠狠7777视频 | 国产免费av在线 | 国产亚洲一区二区在线 | 亚洲精品一区中文字幕乱码 | 国产精品爱久久久久久久 | 91性高湖久久久久久久久_久久99 | 三级视频网站 | 人人九九 | 成人日韩在线观看 | 天天夜碰日日摸日日澡 | 毛片网在线观看 | 日日爱夜夜操 | 国产精品国产精品国产专区不卡 | 9色网站 | 在线不卡a资源高清 | 在线观看国产日韩欧美 | 日本一区二区精品 | 精品亚洲一区二区三区在线观看 | 日韩一级 | 欧美日韩精品一区二区在线播放 | 国产福利91精品一区二区 | 精品美女在线观看视频在线观看 | 成人一区二区电影 | 国产综合精品视频 | 国产精品99一区二区三区 | 国产欧美精品一区二区三区 | 欧美精品一区二区三区蜜桃视频 | 欧美日本国产欧美日本韩国99 | 亚洲精品一区二区三区蜜桃久 | 欧美亚洲视频 | 日韩精品一区二区在线观看 | 免费成人在线观看视频 | 日韩一级黄色大片 | 欧美一区二区三区免费 | 亚洲 欧美 在线 一区 | 在线观看三级av | 国产欧美精品区一区二区三区 | 欧美一区二区三区国产精品 | 精品一区免费 | 欧美一区二区三区在线视频观看 | 成人天堂噜噜噜 | 国产精选久久 | 99热精品国产 | 国产福利视频 | 久久影院一区 | 一区二区中文字幕 | 91在线观看视频 | 国产视频一区二区三区四区 | 黄色一级视屏 | 99久草 | 欧美日韩不卡合集视频 | 国内外成人在线视频 | 色一情| 国产黄色一级片 | 伊人天堂网 | 国产精品一区二区三区在线免费观看 | 黄网在线观看 | 极品久久久久久 | 亚洲精品一区二区三区四区高清 | 日本欧美一区二区 | 日韩在线中文字幕 | 欧美成亚洲 | 天天久| 久久se精品一区精品二区 | 成人在线网站 | 日韩久久精品 | 黄色片网站 | 天天天干天天射天天天操 | 日本成人片网站 | 99久久精品免费看国产四区 | 免费黄色在线 | 久久精品亚洲一区二区 | 免费一二区| www.成人在线视频 | 欧美一级视频 | 九色精品| 国产精品久久久久影院色老大 | 成人羞羞网站 | 91黄色在线观看 | 午夜爽 | 久草视频免费看 | 在线欧美亚洲 | 韩日免费视频 | 九九精品久久久 | 中文字幕在线视频免费播放 | 精品久久久久久久久久久久 | 99热国产在线观看 | 日韩欧美一区二区在线观看视频 | 中文字幕 视频一区 | 五月天电影网 | 99久久精品国产一区二区成人 | 成人 在线 | 欧美精品一区二区三区蜜臀 | 91亚洲精品乱码久久久久久蜜桃 | 四虎小视频 | 亚洲视频在线播放 | 激情伊人 | 国产精品久久久久久久久久久新郎 | 97av在线| 亚洲一区免费视频 | 久久综合一区二区三区 | 91久久夜色精品国产九色 | 久久久国产视频 | 国产精品国产精品国产专区不蜜 | 九九人人 | 一二区精品 | 欧美视频在线播放 | www.一级电影 | 日韩3级 | 91中文字幕| 国产免费天天看高清影视在线 | 国产成人99久久亚洲综合精品 | 日韩精品一区二区三区中文字幕 | 2012中文版免费观看 | 国产1区2区| 日韩三级在线 | 国产精品美女视频免费观看软件 | 2020国产在线 | 国产精品三级久久久久久电影 | 亚洲高清在线观看 | 亚洲精品在线观看免费 | www,四虎 | 日韩av电影免费 | 日韩国产精品一区二区三区 | av综合站 | 亚洲男人天堂2023 | 99久草 | 欧美久久久久 |