日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java: 程序包lombok不存在_Java开发神器:Lombok 学习指南

發(fā)布時間:2023/12/1 java 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java: 程序包lombok不存在_Java开发神器:Lombok 学习指南 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點(diǎn)擊上方“Java知音”,選擇“置頂公眾號”

技術(shù)文章第一時間送達(dá)!

作者:semlinker

www.segmentfault.com/a/1190000020864572

一、Lombok 簡介

Lombok 是一款 Java 開發(fā)插件,使得 Java 開發(fā)者可以通過其定義的一些注解來消除業(yè)務(wù)工程中冗長和繁瑣的代碼,尤其對于簡單的 Java 模型對象(POJO)。

在開發(fā)環(huán)境中使用 Lombok 插件后,Java 開發(fā)人員可以節(jié)省出重復(fù)構(gòu)建,諸如 hashCode 和 equals 這樣的方法以及各種業(yè)務(wù)對象模型的 accessor 和 toString 等方法的大量時間。

對于這些方法,Lombok 能夠在編譯源代碼期間自動幫我們生成這些方法,但并不會像反射那樣降低程序的性能。

二、Lombok 安裝

2.1 構(gòu)建工具

Gradle

在 build.gradle 文件中添加 lombok 依賴:

dependencies?{
????compileOnly?'org.projectlombok:lombok:1.18.10'
????annotationProcessor?'org.projectlombok:lombok:1.18.10'
}

Maven

在 Maven 項目的 pom.xml 文件中添加 lombok 依賴:

<dependency>
????????<groupId>org.projectlombokgroupId>
????????<artifactId>lombokartifactId>
????????<version>1.18.10version>
????????<scope>providedscope>
dependency>

Ant

假設(shè)在 lib 目錄中已經(jīng)存在 lombok.jar,然后設(shè)置 javac 任務(wù):

<javac?srcdir="src"?destdir="build"?source="1.8">
????<classpath?location="lib/lombok.jar"?/>
javac>

2.2 IDE

由于 Lombok 僅在編譯階段生成代碼,所以使用 Lombok 注解的源代碼,在 IDE 中會被高亮顯示錯誤,針對這個問題可以通過安裝 IDE 對應(yīng)的插件來解決。

這里不詳細(xì)展開,具體的安裝方式可以參考:

https://www.baeldung.com/lombok-ide

三、Lombok 詳解

注意:以下示例所使用的 Lombok 版本是 1.18.10

3.1 @Getter and @Setter 注解

你可以使用 @Getter 或 @Setter 注釋任何類或字段,Lombok 會自動生成默認(rèn)的 getter/setter 方法。

@Getter 注解

@Target({ElementType.FIELD,?ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public?@interface?Getter?{
??//?若getter方法非public的話,可以設(shè)置可訪問級別
????lombok.AccessLevel?value()?default?lombok.AccessLevel.PUBLIC;
????AnyAnnotation[]?onMethod()?default?{};
??//?是否啟用延遲初始化
????boolean?lazy()?default?false;
}

@Setter 注解

@Target({ElementType.FIELD,?ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public?@interface?Setter?{
??//?若setter方法非public的話,可以設(shè)置可訪問級別
????lombok.AccessLevel?value()?default?lombok.AccessLevel.PUBLIC;
????AnyAnnotation[]?onMethod()?default?{};
????AnyAnnotation[]?onParam()?default?{};
}

使用示例

package?com.semlinker.lombok;

@Getter
@Setter
public?class?GetterAndSetterDemo?{
????String?firstName;
????String?lastName;
????LocalDate?dateOfBirth;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?GetterAndSetterDemo?{
????String?firstName;
????String?lastName;
????LocalDate?dateOfBirth;

????public?GetterAndSetterDemo()?{
????}

????//?省略其它setter和getter方法
????public?String?getFirstName()?{
????????return?this.firstName;
????}

????public?void?setFirstName(String?firstName)?{
????????this.firstName?=?firstName;
????}
}

Lazy Getter

@Getter 注解支持一個 lazy 屬性,該屬性默認(rèn)為 false。當(dāng)設(shè)置為 true 時,會啟用延遲初始化,即當(dāng)首次調(diào)用 getter 方法時才進(jìn)行初始化。

示例

package?com.semlinker.lombok;

public?class?LazyGetterDemo?{
????public?static?void?main(String[]?args)?{
????????LazyGetterDemo?m?=?new?LazyGetterDemo();
????????System.out.println("Main?instance?is?created");
????????m.getLazy();
????}

????@Getter
????private?final?String?notLazy?=?createValue("not?lazy");

????@Getter(lazy?=?true)
????private?final?String?lazy?=?createValue("lazy");

????private?String?createValue(String?name)?{
????????System.out.println("createValue("?+?name?+?")");
????????return?null;
????}
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?LazyGetterDemo?{
????private?final?String?notLazy?=?this.createValue("not?lazy");
????private?final?AtomicReference?lazy?=?new?AtomicReference();//?已省略部分代碼public?String?getNotLazy()?{return?this.notLazy;
????}public?String?getLazy()?{
????????Object?value?=?this.lazy.get();if?(value?==?null)?{
????????????synchronized(this.lazy)?{
????????????????value?=?this.lazy.get();if?(value?==?null)?{
????????????????????String?actualValue?=?this.createValue("lazy");
????????????????????value?=?actualValue?==?null???this.lazy?:?actualValue;this.lazy.set(value);
????????????????}
????????????}
????????}return?(String)((String)(value?==?this.lazy???null?:?value));
????}
}

通過以上代碼可知,調(diào)用 getLazy 方法時,若發(fā)現(xiàn) value 為 null,則會在同步代碼塊中執(zhí)行初始化操作。

3.2 Constructor Annotations

@NoArgsConstructor 注解

使用 @NoArgsConstructor 注解可以為指定類,生成默認(rèn)的構(gòu)造函數(shù),@NoArgsConstructor 注解的定義如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public?@interface?NoArgsConstructor?{
??//?若設(shè)置該屬性,將會生成一個私有的構(gòu)造函數(shù)且生成一個staticName指定的靜態(tài)方法
????String?staticName()?default?"";????
????AnyAnnotation[]?onConstructor()?default?{};
??//?設(shè)置生成構(gòu)造函數(shù)的訪問級別,默認(rèn)是public
????AccessLevel?access()?default?lombok.AccessLevel.PUBLIC;
??//?若設(shè)置為true,則初始化所有final的字段為0/null/false
????boolean?force()?default?false;
}

示例

package?com.semlinker.lombok;

@NoArgsConstructor(staticName?=?"getInstance")
public?class?NoArgsConstructorDemo?{
????private?long?id;
????private?String?name;
????private?int?age;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?NoArgsConstructorDemo?{
????private?long?id;
????private?String?name;
????private?int?age;

????private?NoArgsConstructorDemo()?{
????}

????public?static?NoArgsConstructorDemo?getInstance()?{
????????return?new?NoArgsConstructorDemo();
????}
}

@AllArgsConstructor 注解

使用 @AllArgsConstructor 注解可以為指定類,生成包含所有成員的構(gòu)造函數(shù),@AllArgsConstructor 注解的定義如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public?@interface?AllArgsConstructor?{
??//?若設(shè)置該屬性,將會生成一個私有的構(gòu)造函數(shù)且生成一個staticName指定的靜態(tài)方法
????String?staticName()?default?"";
????AnyAnnotation[]?onConstructor()?default?{};
??//?設(shè)置生成構(gòu)造函數(shù)的訪問級別,默認(rèn)是public
????AccessLevel?access()?default?lombok.AccessLevel.PUBLIC;
}

示例

package?com.semlinker.lombok;

@AllArgsConstructor
public?class?AllArgsConstructorDemo?{
????private?long?id;
????private?String?name;
????private?int?age;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?AllArgsConstructorDemo?{
????private?long?id;
????private?String?name;
????private?int?age;

????public?AllArgsConstructorDemo(long?id,?String?name,?int?age)?{
????????this.id?=?id;
????????this.name?=?name;
????????this.age?=?age;
????}
}

@RequiredArgsConstructorDemo 注解

使用 @RequiredArgsConstructor 注解可以為指定類必須初始化的成員變量,如 final 成員變量,生成對應(yīng)的構(gòu)造函數(shù),@RequiredArgsConstructor 注解的定義如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public?@interface?RequiredArgsConstructor?{
??//?若設(shè)置該屬性,將會生成一個私有的構(gòu)造函數(shù)且生成一個staticName指定的靜態(tài)方法
????String?staticName()?default?"";
????AnyAnnotation[]?onConstructor()?default?{};
??//?設(shè)置生成構(gòu)造函數(shù)的訪問級別,默認(rèn)是public
????AccessLevel?access()?default?lombok.AccessLevel.PUBLIC;
}

示例

package?com.semlinker.lombok;

@RequiredArgsConstructor
public?class?RequiredArgsConstructorDemo?{
????private?final?long?id;
????private?String?name;
????private?int?age;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?RequiredArgsConstructorDemo?{
????private?final?long?id;
????private?String?name;
????private?int?age;

????public?RequiredArgsConstructorDemo(long?id)?{
????????this.id?=?id;
????}
}

3.3 @EqualsAndHashCode 注解

使用 @EqualsAndHashCode 注解可以為指定類生成 equals 和 hashCode 方法, @EqualsAndHashCode 注解的定義如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public?@interface?EqualsAndHashCode?{
??//?指定在生成的equals和hashCode方法中需要排除的字段列表
????String[]?exclude()?default?{};

??//?顯式列出用于identity的字段,一般情況下non-static,non-transient字段會被用于identity
????String[]?of()?default?{};

??//?標(biāo)識在執(zhí)行字段計算前,是否調(diào)用父類的equals和hashCode方法
????boolean?callSuper()?default?false;

????boolean?doNotUseGetters()?default?false;

????AnyAnnotation[]?onParam()?default?{};

????@Deprecated
????@Retention(RetentionPolicy.SOURCE)
????@Target({})
????@interface?AnyAnnotation?{}

????@Target(ElementType.FIELD)
????@Retention(RetentionPolicy.SOURCE)
????public?@interface?Exclude?{}

????@Target({ElementType.FIELD,?ElementType.METHOD})
????@Retention(RetentionPolicy.SOURCE)
????public?@interface?Include?{
????????String?replaces()?default?"";
????}
}

示例

package?com.semlinker.lombok;

@EqualsAndHashCode
public?class?EqualsAndHashCodeDemo?{
????String?firstName;
????String?lastName;
????LocalDate?dateOfBirth;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?EqualsAndHashCodeDemo?{
????String?firstName;
????String?lastName;
????LocalDate?dateOfBirth;

????public?EqualsAndHashCodeDemo()?{
????}

????public?boolean?equals(Object?o)?{
????????if?(o?==?this)?{
????????????return?true;
????????}?else?if?(!(o?instanceof?EqualsAndHashCodeDemo))?{
????????????return?false;
????????}?else?{
????????????EqualsAndHashCodeDemo?other?=?(EqualsAndHashCodeDemo)o;
????????????if?(!other.canEqual(this))?{
????????????????return?false;
????????????}?else?{
??????????????//?已省略大量代碼
????????}
????}

????public?int?hashCode()?{
????????int?PRIME?=?true;
????????int?result?=?1;
????????Object?$firstName?=?this.firstName;
????????int?result?=?result?*?59?+?($firstName?==?null???43?:?$firstName.hashCode());
????????Object?$lastName?=?this.lastName;
????????result?=?result?*?59?+?($lastName?==?null???43?:?$lastName.hashCode());
????????Object?$dateOfBirth?=?this.dateOfBirth;
????????result?=?result?*?59?+?($dateOfBirth?==?null???43?:?$dateOfBirth.hashCode());
????????return?result;
????}
}

3.4 @ToString 注解

使用 @ToString 注解可以為指定類生成 toString 方法, @ToString 注解的定義如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public?@interface?ToString?{
??//?打印輸出時是否包含字段的名稱
????boolean?includeFieldNames()?default?true;

??//?列出打印輸出時,需要排除的字段列表
????String[]?exclude()?default?{};

??//?顯式的列出需要打印輸出的字段列表
????String[]?of()?default?{};

??//?打印輸出的結(jié)果中是否包含父類的toString方法的返回結(jié)果
????boolean?callSuper()?default?false;

????boolean?doNotUseGetters()?default?false;

????boolean?onlyExplicitlyIncluded()?default?false;

????@Target(ElementType.FIELD)
????@Retention(RetentionPolicy.SOURCE)
????public?@interface?Exclude?{}

????@Target({ElementType.FIELD,?ElementType.METHOD})
????@Retention(RetentionPolicy.SOURCE)
????public?@interface?Include?{
????????int?rank()?default?0;
????????String?name()?default?"";
????}
}

示例

package?com.semlinker.lombok;

@ToString(exclude?=?{"dateOfBirth"})
public?class?ToStringDemo?{
????String?firstName;
????String?lastName;
????LocalDate?dateOfBirth;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?ToStringDemo?{
????String?firstName;
????String?lastName;
????LocalDate?dateOfBirth;

????public?ToStringDemo()?{
????}

????public?String?toString()?{
????????return?"ToStringDemo(firstName="?+?this.firstName?+?",?lastName="?+?
??????????this.lastName?+?")";
????}
}

3.5 @Data 注解

@Data 注解與同時使用以下的注解的效果是一樣的:

  • @ToString

  • @Getter

  • @Setter

  • @RequiredArgsConstructor

  • @EqualsAndHashCode

@Data 注解的定義如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public?@interface?Data?{
????String?staticConstructor()?default?"";
}

示例

package?com.semlinker.lombok;

@Data
public?class?DataDemo?{
????private?Long?id;
????private?String?summary;
????private?String?description;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?DataDemo?{
????private?Long?id;
????private?String?summary;
????private?String?description;

????public?DataDemo()?{
????}

????//?省略summary和description成員屬性的setter和getter方法
????public?Long?getId()?{
????????return?this.id;
????}

????public?void?setId(Long?id)?{
????????this.id?=?id;
????}

????public?boolean?equals(Object?o)?{
????????if?(o?==?this)?{
????????????return?true;
????????}?else?if?(!(o?instanceof?DataDemo))?{
????????????return?false;
????????}?else?{
????????????DataDemo?other?=?(DataDemo)o;
????????????if?(!other.canEqual(this))?{
????????????????return?false;
????????????}?else?{
???????????????//?已省略大量代碼
????????????}
????????}
????}

????protected?boolean?canEqual(Object?other)?{
????????return?other?instanceof?DataDemo;
????}

????public?int?hashCode()?{
????????int?PRIME?=?true;
????????int?result?=?1;
????????Object?$id?=?this.getId();
????????int?result?=?result?*?59?+?($id?==?null???43?:?$id.hashCode());
????????Object?$summary?=?this.getSummary();
????????result?=?result?*?59?+?($summary?==?null???43?:?$summary.hashCode());
????????Object?$description?=?this.getDescription();
????????result?=?result?*?59?+?($description?==?null???43?:?$description.hashCode());
????????return?result;
????}

????public?String?toString()?{
????????return?"DataDemo(id="?+?this.getId()?+?",?summary="?+?this.getSummary()?+?",?description="?+?this.getDescription()?+?")";
????}
}

3.6 @Log 注解

若你將 @Log 的變體放在類上(適用于你所使用的日志記錄系統(tǒng)的任何一種);之后,你將擁有一個靜態(tài)的 final log 字段,然后你就可以使用該字段來輸出日志。

@Log

private?static?final?java.util.logging.Logger?log?=?
java.util.logging.Logger.getLogger(LogExample.class.getName());

@Log4j

private?static?final?org.apache.log4j.Logger?log?=?
org.apache.log4j.Logger.getLogger(LogExample.class);

@Log4j2

private?static?final?org.apache.logging.log4j.Logger?log?=?
org.apache.logging.log4j.LogManager.getLogger(LogExample.class);

@Slf4j

private?static?final?org.slf4j.Logger?log?=?
org.slf4j.LoggerFactory.getLogger(LogExample.class);

@XSlf4j

private?static?final?org.slf4j.ext.XLogger?log?=?
org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

@CommonsLog

private?static?final?org.apache.commons.logging.Log?log?=?
org.apache.commons.logging.LogFactory.getLog(LogExample.class);

3.7 @Synchronized 注解

@Synchronized 是同步方法修飾符的更安全的變體。與 synchronized 一樣,該注解只能應(yīng)用在靜態(tài)和實(shí)例方法上。它的操作類似于 synchronized 關(guān)鍵字,但是它鎖定在不同的對象上。synchronized 關(guān)鍵字應(yīng)用在實(shí)例方法時,鎖定的是 this 對象,而應(yīng)用在靜態(tài)方法上鎖定的是類對象。

對于 @Synchronized 注解聲明的方法來說,它鎖定的是?$LOCK?或?$lock。@Synchronized 注解的定義如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public?@interface?Synchronized?{
??//?指定鎖定的字段名稱
????String?value()?default?"";
}

示例

package?com.semlinker.lombok;

public?class?SynchronizedDemo?{
????private?final?Object?readLock?=?new?Object();

????@Synchronized
????public?static?void?hello()?{
????????System.out.println("world");
????}

????@Synchronized
????public?int?answerToLife()?{
????????return?42;
????}

????@Synchronized("readLock")
????public?void?foo()?{
????????System.out.println("bar");
????}
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?SynchronizedDemo?{
????private?static?final?Object?$LOCK?=?new?Object[0];
????private?final?Object?$lock?=?new?Object[0];
????private?final?Object?readLock?=?new?Object();

????public?SynchronizedDemo()?{
????}

????public?static?void?hello()?{
????????synchronized($LOCK)?{
????????????System.out.println("world");
????????}
????}

????public?int?answerToLife()?{
????????synchronized(this.$lock)?{
????????????return?42;
????????}
????}

????public?void?foo()?{
????????synchronized(this.readLock)?{
????????????System.out.println("bar");
????????}
????}
}

3.8 @Builder 注解

使用 @Builder 注解可以為指定類實(shí)現(xiàn)建造者模式,該注解可以放在類、構(gòu)造函數(shù)或方法上。@Builder 注解的定義如下:

@Target({TYPE,?METHOD,?CONSTRUCTOR})
@Retention(SOURCE)
public?@interface?Builder?{
????@Target(FIELD)
????@Retention(SOURCE)
????public?@interface?Default?{}

??//?創(chuàng)建新的builder實(shí)例的方法名稱
????String?builderMethodName()?default?"builder";
????//?創(chuàng)建Builder注解類對應(yīng)實(shí)例的方法名稱
????String?buildMethodName()?default?"build";
????//?builder類的名稱
????String?builderClassName()?default?"";

????boolean?toBuilder()?default?false;

????AccessLevel?access()?default?lombok.AccessLevel.PUBLIC;

????@Target({FIELD,?PARAMETER})
????@Retention(SOURCE)
????public?@interface?ObtainVia?{
????????String?field()?default?"";
????????String?method()?default?"";
????????boolean?isStatic()?default?false;
????}
}

示例

package?com.semlinker.lombok;

@Builder
public?class?BuilderDemo?{
????private?final?String?firstname;
????private?final?String?lastname;
????private?final?String?email;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?BuilderDemo?{
????private?final?String?firstname;
????private?final?String?lastname;
????private?final?String?email;

????BuilderDemo(String?firstname,?String?lastname,?String?email)?{
????????this.firstname?=?firstname;
????????this.lastname?=?lastname;
????????this.email?=?email;
????}

????public?static?BuilderDemo.BuilderDemoBuilder?builder()?{
????????return?new?BuilderDemo.BuilderDemoBuilder();
????}

????public?static?class?BuilderDemoBuilder?{
????????private?String?firstname;
????????private?String?lastname;
????????private?String?email;

????????BuilderDemoBuilder()?{
????????}

????????public?BuilderDemo.BuilderDemoBuilder?firstname(String?firstname)?{
????????????this.firstname?=?firstname;
????????????return?this;
????????}

????????public?BuilderDemo.BuilderDemoBuilder?lastname(String?lastname)?{
????????????this.lastname?=?lastname;
????????????return?this;
????????}

????????public?BuilderDemo.BuilderDemoBuilder?email(String?email)?{
????????????this.email?=?email;
????????????return?this;
????????}

????????public?BuilderDemo?build()?{
????????????return?new?BuilderDemo(this.firstname,?this.lastname,?this.email);
????????}

????????public?String?toString()?{
????????????return?"BuilderDemo.BuilderDemoBuilder(firstname="?+?this.firstname?+?",?lastname="?+?this.lastname?+?",?email="?+?this.email?+?")";
????????}
????}
}

3.9 @SneakyThrows 注解

@SneakyThrows 注解用于自動拋出已檢查的異常,而無需在方法中使用 throw 語句顯式拋出。@SneakyThrows 注解的定義如下:

@Target({ElementType.METHOD,?ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.SOURCE)
public?@interface?SneakyThrows?{
????//?設(shè)置你希望向上拋的異常類
????Class?extends?Throwable>[]?value()?default?java.lang.Throwable.class;
}

示例

package?com.semlinker.lombok;

public?class?SneakyThrowsDemo?{
????@SneakyThrows
????@Override
????protected?Object?clone()?{
????????return?super.clone();
????}
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?SneakyThrowsDemo?{
????public?SneakyThrowsDemo()?{
????}

????protected?Object?clone()?{
????????try?{
????????????return?super.clone();
????????}?catch?(Throwable?var2)?{
????????????throw?var2;
????????}
????}
}

3.10 @NonNull 注解

你可以在方法或構(gòu)造函數(shù)的參數(shù)上使用 @NonNull 注解,它將會為你自動生成非空校驗語句。@NonNull 注解的定義如下:

@Target({ElementType.FIELD,?ElementType.METHOD,?ElementType.PARAMETER,?ElementType.LOCAL_VARIABLE,?ElementType.TYPE_USE})
@Retention(RetentionPolicy.CLASS)
@Documented
public?@interface?NonNull?{
}

示例

package?com.semlinker.lombok;

public?class?NonNullDemo?{
????@Getter
????@Setter
????@NonNull
????private?String?name;
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?NonNullDemo?{
????@NonNull
????private?String?name;

????public?NonNullDemo()?{
????}

????@NonNull
????public?String?getName()?{
????????return?this.name;
????}

????public?void?setName(@NonNull?String?name)?{
????????if?(name?==?null)?{
????????????throw?new?NullPointerException("name?is?marked?non-null?but?is?null");
????????}?else?{
????????????this.name?=?name;
????????}
????}
}

3.11 @Clean 注解

@Clean 注解用于自動管理資源,用在局部變量之前,在當(dāng)前變量范圍內(nèi)即將執(zhí)行完畢退出之前會自動清理資源,自動生成 try-finally 這樣的代碼來關(guān)閉流。

@Target(ElementType.LOCAL_VARIABLE)
@Retention(RetentionPolicy.SOURCE)
public?@interface?Cleanup?{
??//?設(shè)置用于執(zhí)行資源清理/回收的方法名稱,對應(yīng)方法不能包含任何參數(shù),默認(rèn)名稱為close。
????String?value()?default?"close";
}

示例

package?com.semlinker.lombok;

public?class?CleanupDemo?{
????public?static?void?main(String[]?args)?throws?IOException?{
????????@Cleanup?InputStream?in?=?new?FileInputStream(args[0]);
????????@Cleanup?OutputStream?out?=?new?FileOutputStream(args[1]);
????????byte[]?b?=?new?byte[10000];
????????while?(true)?{
????????????int?r?=?in.read(b);
????????????if?(r?==?-1)?break;
????????????out.write(b,?0,?r);
????????}
????}
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

package?com.semlinker.lombok;

public?class?CleanupDemo?{
????public?CleanupDemo()?{
????}

????public?static?void?main(String[]?args)?throws?IOException?{
????????FileInputStream?in?=?new?FileInputStream(args[0]);

????????try?{
????????????FileOutputStream?out?=?new?FileOutputStream(args[1]);

????????????try?{
????????????????byte[]?b?=?new?byte[10000];

????????????????while(true)?{
????????????????????int?r?=?in.read(b);
????????????????????if?(r?==?-1)?{
????????????????????????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();
????????????}
????????}
????}
}

3.11 @With 注解

在類的字段上應(yīng)用 @With 注解之后,將會自動生成一個 withFieldName(newValue) 的方法,該方法會基于 newValue 調(diào)用相應(yīng)構(gòu)造函數(shù),創(chuàng)建一個當(dāng)前類對應(yīng)的實(shí)例。@With 注解的定義如下:

@Target({ElementType.FIELD,?ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public?@interface?With?{
????AccessLevel?value()?default?AccessLevel.PUBLIC;

????With.AnyAnnotation[]?onMethod()?default?{};

????With.AnyAnnotation[]?onParam()?default?{};

????@Deprecated
????@Retention(RetentionPolicy.SOURCE)
????@Target({})
????public?@interface?AnyAnnotation?{
????}
}

示例

public?class?WithDemo?{
????@With(AccessLevel.PROTECTED)
????@NonNull
????private?final?String?name;
????@With
????private?final?int?age;

????public?WithDemo(String?name,?int?age)?{
????????if?(name?==?null)?throw?new?NullPointerException();
????????this.name?=?name;
????????this.age?=?age;
????}
}

以上代碼經(jīng)過 Lombok 編譯后,會生成如下代碼:

public?class?WithDemo?{
????@NonNull
????private?final?String?name;
????private?final?int?age;

????public?WithDemo(String?name,?int?age)?{
????????if?(name?==?null)?{
????????????throw?new?NullPointerException();
????????}?else?{
????????????this.name?=?name;
????????????this.age?=?age;
????????}
????}

????protected?WithDemo?withName(@NonNull?String?name)?{
????????if?(name?==?null)?{
????????????throw?new?NullPointerException("name?is?marked?non-null?but?is?null");
????????}?else?{
????????????return?this.name?==?name???this?:?new?WithDemo(name,?this.age);
????????}
????}

????public?WithDemo?withAge(int?age)?{
????????return?this.age?==?age???this?:?new?WithDemo(this.name,?age);
????}
}

3.12 其它特性

val

val 用在局部變量前面,相當(dāng)于將變量聲明為 final,此外 Lombok 在編譯時還會自動進(jìn)行類型推斷。val 的使用示例:

public?class?ValExample?{
??public?String?example()?{
????val?example?=?new?ArrayList();
????example.add("Hello,?World!");
????val?foo?=?example.get(0);return?foo.toLowerCase();
??}public?void?example2()?{
????val?map?=?new?HashMap();map.put(0,?"zero");map.put(5,?"five");for?(val?entry?:?map.entrySet())?{
??????System.out.printf("%d:?%s\n",?entry.getKey(),?entry.getValue());
????}
??}
}

以上代碼等價于:

public?class?ValExample?{
??public?String?example()?{
????final?ArrayList<String>?example?=?new?ArrayList<String>();
????example.add("Hello,?World!");
????final?String?foo?=?example.get(0);
????return?foo.toLowerCase();
??}

??public?void?example2()?{
????final?HashMapString>?map?=?new?HashMapString>();
????map.put(0,?"zero");
????map.put(5,?"five");for?(final?Map.EntryString>?entry?:?map.entrySet())?{
??????System.out.printf("%d:?%s\n",?entry.getKey(),?entry.getValue());
????}
??}
}

至此功能強(qiáng)大的 Lombok 工具就介紹完了。若你對于它的實(shí)現(xiàn)原理感興趣的話,建議閱讀:

https://www.jianshu.com/p/63038c7c515a

示例項目地址:

https://github.com/semlinker/springstack/tree/master/springboot2-lombok

四、參考資源

  • https://projectlombok.org/

  • https://interviewbubble.com/lombok-cheatsheet/

  • http://blog.didispace.com/java-lombok-how-to-use/

END

Java面試題專欄

【01期】Spring,SpringMVC,SpringBoot,SpringCloud有什么區(qū)別和聯(lián)系?

【02期】你能說說Spring框架中Bean的生命周期嗎?

【03期】如何決定使用 HashMap 還是 TreeMap?

【04期】分庫分表之后,id 主鍵如何處理?

【05期】消息隊列中,如何保證消息的順序性?

【06期】單例模式有幾種寫法?

【07期】Redis中是如何實(shí)現(xiàn)分布式鎖的?

【08期】說說Object類下面有幾種方法呢?

【09期】說說hashCode() 和 equals() 之間的關(guān)系?

【10期】Redis 面試常見問答

我知道你 “在看

總結(jié)

以上是生活随笔為你收集整理的java: 程序包lombok不存在_Java开发神器:Lombok 学习指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

日韩一区二区三免费高清在线观看 | 国产剧情一区二区 | 午夜av影院| 精品视频9999 | 天天色天| 亚洲欧美成人综合 | 久久九九久久 | 久草视频在线免费播放 | av日韩在线网站 | 国产最新视频在线观看 | 国产精品久久久久久av | www.久草.com | 一区二区在线电影 | 亚洲第一区精品 | 狠狠的操狠狠的干 | av资源中文字幕 | 国语久久 | 久久国产精品久久w女人spa | 久久久久国产精品免费免费搜索 | 免费日韩一区二区 | 黄色a视频 | 久久久国产在线视频 | 国产亚洲欧美精品久久久久久 | 最新日本中文字幕 | 超碰在线色 | 亚洲精品资源在线观看 | 久青草电影 | 欧美日韩在线观看视频 | 天天爽天天射 | 日韩精品一区二区免费视频 | 午夜久久成人 | 日韩久久久久久 | 亚洲资源一区 | 在线精品观看 | 国产成人精品不卡 | 在线成人国产 | 国产精品初高中精品久久 | www.色午夜.com | 国产精品久久久久影视 | 99久久免费看 | 亚洲视频99 | 欧美性大战久久久久 | 亚洲精品视频偷拍 | 日韩免费在线观看视频 | 天天天色综合a | 97视频在线观看播放 | 99亚洲精品 | 91亚洲精品久久久蜜桃 | 亚洲国产影院 | 2023国产精品自产拍在线观看 | av大全在线 | 亚洲一区视频免费观看 | 国产精品热| 中文字幕在线精品 | 亚洲精品久久久蜜桃 | 一区二区中文字幕在线播放 | 亚洲一区av | 国产一二区视频 | 国产精品黄 | 国产午夜精品免费一区二区三区视频 | 久久97超碰 | 国产成人免费观看久久久 | 91精品免费在线视频 | 狠狠色丁香婷婷综合视频 | 免费在线观看av | 六月丁香久久 | 性色av免费看 | 国产高清在线免费视频 | 午夜影院一级片 | 亚洲精品中文字幕在线 | 狠狠撸电影 | 国产成人精品日本亚洲999 | 国产精品大尺度 | 久久99国产综合精品免费 | 婷婷色网站 | 97品白浆高清久久久久久 | 欧美日韩国产页 | 亚洲人人av | 一区二区三区在线免费 | 欧美日韩视频在线观看免费 | 91精品久久香蕉国产线看观看 | 国产精品入口a级 | 国产精品视频你懂的 | 中文字幕一区二区三区四区视频 | 国产99亚洲 | 九九三级毛片 | 999国产精品视频 | 一区二区电影在线观看 | 中文字幕高清视频 | 日韩亚洲精品电影 | av大片网站 | 激情综合啪| 97精品一区二区三区 | 波多野结衣一区二区三区中文字幕 | 在线看片91 | 日本在线观看视频一区 | 九色91在线 | 一区二区三区电影大全 | 欧美激情视频免费看 | 国际av在线| 在线婷婷 | 亚洲经典视频在线观看 | 在线视频成人 | 色综合天天色综合 | 国产久草在线观看 | 久久久精选 | 国产护士在线 | 国产日韩亚洲 | 91日本在线播放 | 亚洲国产精品va在线看黑人动漫 | 免费美女av | 超碰97国产在线 | av免费网站 | 欧美黄色高清 | 98精品国产自产在线观看 | 欧美日韩国产成人 | 97精品国产97久久久久久 | 亚洲日b视频| 欧美男女爱爱视频 | 色一级片 | 色橹橹欧美在线观看视频高清 | 欧美日韩视频免费看 | 国产精品一区二区三区在线 | 国产精品久久精品 | 免费网站观看www在线观看 | 99免费在线观看 | 91视频免费看网站 | 中国黄色一级大片 | 国产香蕉97碰碰碰视频在线观看 | 黄色大全免费观看 | 最新av免费在线观看 | 午夜视频一区二区 | 亚洲有 在线 | 国产综合福利在线 | 欧美日韩裸体免费视频 | sesese图片| 又长又大又黑又粗欧美 | 91三级视频 | 欧美日韩一区二区三区不卡 | 欧美日韩精品二区第二页 | 久久久久女人精品毛片九一 | 亚洲国产精品成人va在线观看 | 中文字幕亚洲国产 | 久久久九色精品国产一区二区三区 | 最新一区二区三区 | 成人久久久精品国产乱码一区二区 | 一区二区电影在线观看 | 久久兔费看a级 | 精品国产免费人成在线观看 | 免费视频一二三区 | 丰满少妇在线观看 | 精品视频在线免费 | 中文在线a在线 | 激情五月***国产精品 | 国产精品在线看 | 玖草在线观看 | 国产午夜精品av一区二区 | 在线欧美日韩 | 久草综合在线观看 | 国产在线一区二区三区播放 | 久久久久99999 | 久久国产精品电影 | 日本精a在线观看 | 午夜av一区二区三区 | 99热在线免费观看 | 91在线蜜桃臀 | 91视频免费网址 | 天天操天天射天天 | 久久久久免费网 | 日韩在线观看你懂得 | 91在线精品观看 | 超碰97在线资源站 | 色婷婷丁香 | 永久免费av在线播放 | 久久久免费观看完整版 | 中文字幕免费播放 | 国产亚洲高清视频 | 丁香视频全集免费观看 | 久久 地址| 免费观看一级成人毛片 | 久久这里只精品 | 综合网天天色 | 亚洲视频免费视频 | 国产最新91| 国产日韩欧美在线免费观看 | 国产大片黄色 | 特级西西人体444是什么意思 | 国产精品一区二区三区四区在线观看 | 日韩成人免费在线观看 | www好男人| 久久国产精品一二三区 | 久久草视频 | 五月在线视频 | 91久久在线观看 | 日本中文字幕在线看 | 免费在线观看亚洲视频 | 嫩模bbw搡bbbb搡bbbb | 精品国模一区二区三区 | 国产美女黄网站免费 | www天天干com | 免费www视频 | 最近中文字幕视频完整版 | 国产精品第一页在线观看 | 美女视频一区二区 | 国产高清av免费在线观看 | 免费成人黄色片 | 永久精品视频 | 亚洲九九九在线观看 | 国产精品第二页 | 国产另类xxxxhd高清 | 国产精品色婷婷视频 | 色综合久久88色综合天天人守婷 | 毛片美女网站 | 亚洲精品五月 | 9在线观看免费高清完整版在线观看明 | 免费色视频网站 | 国产大陆亚洲精品国产 | 国产中文字幕第一页 | 亚洲美女免费精品视频在线观看 | 日韩在线观看一区二区三区 | 国产不卡av在线 | 国产一区二区三区视频在线 | 国产精品二区在线观看 | 91精品久久久久久久久久入口 | 永久免费的啪啪网站免费观看浪潮 | 99在线观看免费视频精品观看 | 久久久久久久久久久影视 | 国产性天天综合网 | 久久精品站 | 中国成人一区 | 久久精品站 | 99久久婷婷国产 | 91热爆在线观看 | 丝袜制服综合网 | av成人在线网站 | 日韩xxxbbb| 视频二区在线视频 | 色综合久久88色综合天天人守婷 | 国产福利在线 | 99视频 | 久久精品三 | 麻豆 free xxxx movies hd| 中文字幕在线播放av | jizz欧美性9| 特黄特黄的视频 | www.一区二区三区 | 3d黄动漫免费看 | 亚洲视频电影在线 | 国产精品21区 | 午夜精品一区二区三区可下载 | 丁香激情五月婷婷 | 综合网婷婷| 久久毛片高清国产 | 国产精品区免费视频 | 国产手机精品视频 | 五月在线视频 | 成年人免费观看国产 | 天天玩夜夜操 | 国产特级毛片aaaaaa | 欧美在线视频第一页 | 日韩在线视频国产 | 成年人免费在线观看网站 | 成人免费av电影 | 欧美性脚交 | 国产在线观看网站 | 国产韩国精品一区二区三区 | 国产美女在线精品免费观看 | 五月婷婷综合网 | 亚洲精品一区二区网址 | av片子在线观看 | 久久激情电影 | www最近高清中文国语在线观看 | 激情五月激情综合网 | 天天插伊人 | 伊人五月婷| 九九九九热精品免费视频点播观看 | 久久不卡电影 | 精品免费国产一区二区三区四区 | 开心丁香婷婷深爱五月 | 国产精品va在线播放 | 欧美 日韩 国产 中文字幕 | 亚洲精品tv久久久久久久久久 | 国产精品久久久久久久久久 | 在线视频91| 天天综合成人 | 成人在线视频免费观看 | 日韩精品在线看 | 精品国产乱码久久久久久1区二区 | 狠狠色丁香婷婷综合久小说久 | 激情五月婷婷综合网 | 欧美日韩国产综合一区二区 | 久久久久久久久久久久久国产精品 | 国产亚洲精品久久久久久移动网络 | 亚洲精品综合久久 | 久草在线手机视频 | av免费在线免费观看 | 天天爱天天操天天干 | 一区二区三区动漫 | 手机在线黄色网址 | 337p西西人体大胆瓣开下部 | 亚洲精品国产综合久久 | 久久免费成人精品视频 | 亚洲在线色 | 亚洲日本色 | 国产资源精品 | 久草在线视频看看 | 日韩免费在线观看视频 | 久草网首页 | av在线播放观看 | 一区二区影院 | 天天干天天干天天干天天干天天干天天干 | 永久免费的av电影 | 国产午夜精品久久久久久久久久 | 私人av| 免费高清在线一区 | 在线免费黄色片 | 国产精品12345 | 91久久久国产精品 | 国产美女主播精品一区二区三区 | 天天草天天干 | 国产麻豆剧果冻传媒视频播放量 | 欧美日本啪啪无遮挡网站 | 欧美伦理一区二区 | 久久免费视频精品 | 国产系列在线观看 | 国产在线观看高清视频 | 久久伊人精品天天 | 九九精品视频在线观看 | 日韩三级av | 亚洲免费av在线 | 天天曰夜夜爽 | 视频在线观看日韩 | 免费电影一区二区三区 | 日韩电影在线观看一区二区 | 91丨九色丨国产女 | 在线亚洲午夜片av大片 | 成人黄色视 | 在线不卡a | 久久日韩精品 | 国产精品自在线 | 国产97视频在线 | 亚洲国产精品一区二区尤物区 | 国产高清在线免费 | 国产a视频免费观看 | 国产精品综合在线 | 在线观看视频97 | 亚洲综合激情小说 | 国产成人一二片 | 最近中文字幕免费观看 | 久久久久五月 | 天天操天天谢 | 日韩精品短视频 | 亚洲区另类春色综合小说校园片 | 热久久精品在线 | 在线岛国av| 中文字幕丝袜一区二区 | 日韩二区三区在线 | www.色爱| 99热日本| av电影中文 | 久久国产影视 | 91人人插 | 一区二区三区四区不卡 | 91最新视频在线观看 | 99视频| 欧美国产日韩一区二区 | 肉色欧美久久久久久久免费看 | 久久9999久久免费精品国产 | 97在线观看| 黄色美女免费网站 | 欧美性做爰猛烈叫床潮 | 国产精品专区在线观看 | 91成人小视频 | 日韩小视频 | 精品亚洲欧美一区 | 国产高清免费 | 日韩免费区 | 欧美日韩一区二区三区不卡 | www黄com| 亚洲一区视频免费观看 | 精品欧美一区二区在线观看 | 片黄色毛片黄色毛片 | 操操综合网 | 久久在线看 | 91成人精品一区在线播放 | 亚洲日本一区二区在线 | 国产黄a三级三级 | av在线免费观看不卡 | 亚洲砖区区免费 | 亚洲精品午夜aaa久久久 | www免费网站在线观看 | 国产精品video爽爽爽爽 | 国产成人高清av | 99热日本| 久久精品国产一区二区 | 伊人影院得得 | 伊人伊成久久人综合网站 | 日韩r级电影在线观看 | 九九热在线精品视频 | 久久综合欧美精品亚洲一区 | 在线播放国产一区二区三区 | 亚洲欧美日本国产 | 久久久久成人精品亚洲国产 | 国产明星视频三级a三级点| 97在线观看免费观看 | 亚洲电影院 | 91视频链接 | 在线免费av网 | 五月婷香蕉久色在线看 | 五月亚洲综合 | 久久久在线 | 99亚洲国产精品 | 黄色激情网址 | 久久人人爽人人爽人人片av软件 | 国产精品一区二区三区免费看 | 亚洲毛片在线观看. | 麻豆视频免费在线观看 | 国产麻豆精品免费视频 | 亚洲二区精品 | 久久成人一区二区 | 天天操天天添天天吹 | 亚洲精品综合一二三区在线观看 | 中文字幕一区二区三区精华液 | 国产成人精品一区二区三区 | 在线成人av | 久久人人爽人人 | 在线国产一区 | 久久国产成人午夜av影院宅 | 91最新在线视频 | 蜜臀久久99精品久久久酒店新书 | 国产精品成人久久 | 久草在线电影网 | 国产在线毛片 | 一区二区三区精品在线视频 | 麻豆传媒视频在线免费观看 | 天天色天天射天天综合网 | 国产精品video爽爽爽爽 | 狠狠干婷婷 | 99视频在线免费观看 | 久久久精品网站 | 天堂av在线网 | 国产在线播放一区 | 丁香六月网 | 麻豆免费看片 | 婷婷视频在线播放 | 夜夜躁天天躁很躁波 | 99精品国产福利在线观看免费 | 亚洲三级黄色 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 午夜免费久久看 | 97视频在线 | 精精国产xxxx视频在线播放 | 国产成人久久精品亚洲 | 特级西西人体444是什么意思 | 最近中文字幕免费观看 | 国产午夜亚洲精品 | 天天操夜夜摸 | 久久6精品 | 国产精品免费久久久 | 曰韩精品| 国产精品18久久久久久首页狼 | 国产成人一区二区三区在线观看 | 九九色视频 | 丁香婷婷在线观看 | 国产视频亚洲精品 | 亚洲91在线| 伊人久久电影网 | 日韩久久电影 | 91精品国产综合久久婷婷香蕉 | 亚洲日本va在线观看 | 欧美综合在线视频 | 日韩精品一区二区三区不卡 | 五月天亚洲激情 | 日日夜夜免费精品 | 久久久久成 | 黄色不卡av | 日韩v欧美v日本v亚洲v国产v | 免费v片 | 国产精品久久久久久一区二区三区 | 成人免费观看大片 | 五月婷婷丁香综合 | 91av精品| 国产成人精品久久亚洲高清不卡 | 日韩专区在线播放 | 视频 天天草 | 色婷婷色| 婷婷播播网 | 91免费网 | 麻豆影音先锋 | 91在线精品视频 | 99精品视频在线观看播放 | 国产成人99av超碰超爽 | 日日夜夜免费精品视频 | 亚洲精品高清一区二区三区四区 | a在线播放| 日韩欧美视频 | 最新国产一区二区三区 | 91精品国产92久久久久 | 91亚洲精品久久久蜜桃网站 | 亚洲 综合 激情 | 成人动漫一区二区三区 | 少妇bbr搡bbb搡bbb | 久久久久久国产精品美女 | 成人夜晚看av | 免费看的黄色录像 | 精品国产一区二区三区男人吃奶 | 亚洲一区二区观看 | 亚洲成人精品久久 | 成人黄色小说在线观看 | 中文字幕免费久久 | av电影免费在线播放 | 美女免费视频观看网站 | 91福利免费 | 九九免费在线观看视频 | 欧美 日韩 久久 | 国产一区视频在线 | 久久亚洲专区 | 久久久久国产a免费观看rela | 国产日韩精品在线观看 | 国产中文字幕三区 | 免费在线观看av片 | 综合久久久久久久 | 午夜精品一区二区三区视频免费看 | 久久综合中文字幕 | 中文字幕av免费在线观看 | 久久精品成人欧美大片古装 | 精品国产成人av在线免 | 日韩久久精品 | 黄免费网站 | 国产精品久久久久久69 | 久久久久久高清 | 国产在线播放一区二区三区 | 成人在线免费av | 天天射天天干天天 | 91资源在线视频 | 国产精品久久久亚洲 | 日韩激情在线视频 | 免费视频xnxx com | 波多野结衣在线视频一区 | 91麻豆福利 | 亚洲国产精品久久久久 | 国产永久免费观看 | 色综合久久综合 | 日韩高清三区 | 在线免费观看亚洲视频 | 91视频-88av | 国产成人在线免费观看 | 青春草免费视频 | 国产91九色视频 | 免费看片黄色 | 麻豆视频免费在线观看 | 欧美aa在线 | 欧美xxxxx在线视频 | 综合影视| 精品国产一区二区三区四 | 国产福利精品一区二区 | 在线中文字母电影观看 | 午夜视频福利 | 国产视频二 | 美女视频久久黄 | 最近中文字幕mv | 久久深夜福利免费观看 | 国内丰满少妇猛烈精品播 | 人人射av | 麻豆国产网站入口 | 久久久久国产a免费观看rela | 久久99热这里只有精品 | 国产精品福利在线 | 国产网红在线观看 | 国产性天天综合网 | 91亚洲精品久久久久图片蜜桃 | 日韩av女优视频 | 久久亚洲视频 | 日韩69视频 | 国产黄视频在线观看 | 国产精品99久久久精品免费观看 | 精品一区电影 | 99精品在线免费在线观看 | 在线 成人 | 国产免费亚洲高清 | 欧美色婷婷| 久久久久综合 | 久久久精品国产免费观看一区二区 | 一区二区三区在线播放 | 国内成人精品视频 | 色丁香婷婷 | 成人日批视频 | 国产91精品欧美 | 黄色小说视频在线 | 黄a在线| 国产色妞影院wwwxxx | 国产va饥渴难耐女保洁员在线观看 | 一区二区三区精品在线视频 | 中文字幕一区av | 91成人在线网站 | 91av在线视频播放 | 成年人在线看片 | 草免费视频 | 午夜视频一区二区三区 | 99热.com | 九九九九色 | 伊人电影在线观看 | 99精品视频免费全部在线 | 九草在线观看 | 国产精品美女久久久网av | 国产精品毛片久久久久久 | 国产精品国产三级国产 | 在线一区电影 | 国产精品久久久久av免费 | 亚洲一级黄色av | av在线短片 | 欧美在线一级片 | 国产中文字幕久久 | 亚洲情感电影大片 | 一区二区 精品 | 欧美精品一二三 | av在线不卡观看 | 99在线精品视频 | 国产亚洲视频在线免费观看 | 亚洲在线视频网站 | 夜夜躁日日躁狠狠久久88av | 精品国产一二三四区 | 香蕉视频最新网址 | 少妇bbbb揉bbbb日本 | 日韩二三区 | 一级免费片 | 国产精品久久久久久久婷婷 | 精品在线视频一区 | 欧美一级片在线免费观看 | 婷婷久操 | 青青河边草免费观看完整版高清 | 精品一区精品二区 | 国产一区二区在线精品 | 狠狠狠色丁香婷婷综合久久88 | 国产一区福利 | 日本久久久久久久久久 | 亚洲成人免费在线观看 | 91视频在线播放视频 | 91成人在线免费观看 | 日日干狠狠操 | 久久好看| av片在线观看免费 | 99精品久久精品一区二区 | 欧美另类人妖 | 午夜精品久久久久久99热明星 | 国产淫片 | av中文在线观看 | 日本三级香港三级人妇99 | 午夜精品一区二区三区免费视频 | 免费视频91蜜桃 | 三级黄色片子 | 九九av | 69国产成人综合久久精品欧美 | 91精品国产欧美一区二区 | 91网站在线视频 | 深爱婷婷激情 | 亚洲欧美日韩精品久久久 | 久久久久久久久综合 | 91综合视频在线观看 | 国产精品18videosex性欧美 | www黄在线 | 伊人婷婷色 | 在线观看黄色av | 久久综合在线 | 久久精品视频免费 | 久久久国产精品一区二区三区 | 成人精品一区二区三区中文字幕 | 国产精品96久久久久久吹潮 | 美女网站一区 | 日本中出在线观看 | 国产在线视频在线观看 | 免费人成网| 玖玖999 | 欧美一级欧美一级 | 婷五月激情 | 一区二区三区免费在线 | 国产精品久久久久久久久免费看 | 亚洲精品高清视频 | 久久久久免费精品国产小说色大师 | 久久国产精品免费一区二区三区 | 999视频网站 | 亚洲精品国产精品国自产 | 国产香蕉在线 | 久久久网址 | 美国av片在线观看 | 亚洲精品xxxx| 波多野结衣视频一区 | 伊人婷婷 | 久久av网| 久久男人影院 | 伊人狠狠 | 国产欧美综合视频 | 天堂视频中文在线 | 日韩精品中文字幕一区二区 | 国产精品嫩草影视久久久 | 久草在线免费新视频 | 亚洲精品视频网站在线观看 | 8x成人在线 | 成人av电影免费观看 | 欧美日韩视频在线 | 人人干狠狠干 | 精品人人人人 | 久久视频免费 | 日韩在线视频一区二区三区 | 国产视频久 | 久久伦理电影网 | 黄色.com| 97碰在线 | 亚洲国产三级在线观看 | 四虎天堂 | 久久综合狠狠狠色97 | 四虎免费在线观看视频 | 天天性天天草 | 99精品视频免费看 | 久久av一区二区三区亚洲 | 国产精品video爽爽爽爽 | wwwwww色 | www.国产在线视频 | 免费亚洲黄色 | 国产网站av| 一本一道波多野毛片中文在线 | 亚洲精品永久免费视频 | 开心激情久久 | 伊人亚洲综合网 | 免费观看一区二区三区视频 | 欧美一级艳片视频免费观看 | 国产精品久久久久久婷婷天堂 | 久久免费中文视频 | 在线观看视频在线观看 | 久久久国产一区 | 91av手机在线| 99色资源| 中文字幕在线观看视频免费 | 久久久久一区 | 亚洲性视频 | 久久久综合精品 | 婷婷在线色 | 在线免费黄色av | 男女精品久久 | 97电影院网| 国产98色在线 | 日韩 | 日韩videos高潮hd | 丁香六月婷 | 国产不卡视频在线 | 国产精品久久免费看 | 久久66热这里只有精品 | 亚洲午夜精品在线观看 | 久久国产成人午夜av影院宅 | 亚洲婷婷综合色高清在线 | 97超碰免费在线 | 三上悠亚在线免费 | 色综合久久精品 | 国产综合91 | 国产99久久久国产精品免费二区 | 激情五月五月婷婷 | 久草在线一免费新视频 | 日韩久久一区 | 国产黄色播放 | 又黄又爽的视频在线观看网站 | 深夜激情影院 | 欧美一区二视频在线免费观看 | 性色在线视频 | av电影中文| 91亚洲欧美激情 | 99精品视频免费观看视频 | 精品视频久久 | 国产高清不卡一区二区三区 | 欧美成人精品欧美一级乱 | 日本在线观看中文字幕无线观看 | 日韩av网页| 欧美日韩在线免费观看 | av理论电影 | 亚洲一级片在线看 | www.成人精品 | 在线观看日韩av | 日本不卡一区二区三区在线观看 | 国产视频每日更新 | 国产精品高清免费在线观看 | 欧美日韩在线精品一区二区 | 久久久久久影视 | 欧美一级黄色片 | 日本久久精品视频 | 免费看日韩片 | av日韩在线网站 | 永久免费精品视频网站 | 黄免费网站 | 伊人色综合久久天天 | 欧美黄在线 | 亚洲理论片在线观看 | 欧美精品久久天天躁 | 亚洲三级网站 | 色婷婷婷| 久综合网 | 精品一区电影 | 97人人模人人爽人人喊网 | 黄网站色视频 | 97夜夜澡人人爽人人免费 | 色无五月 | 国产精品综合在线观看 | 看污网站 | 久久99中文字幕 | 97在线免费视频观看 | 亚洲精品视频二区 | 日韩在线播放欧美字幕 | 一级特黄av | 成人av播放 | 91精品啪在线观看国产线免费 | 91福利视频一区 | 天天干,天天射,天天操,天天摸 | 亚洲另类人人澡 | 九九九免费视频 | 亚洲最大激情中文字幕 | 久久久久在线 | 91福利在线导航 | 欧美日本在线视频 | 又爽又黄又刺激的视频 | 亚洲精品成人av在线 | 日日爽天天爽 | 日本女人b| 菠萝菠萝蜜在线播放 | 国产一区二区三区免费在线观看 | 国内视频在线 | 久久久蜜桃一区二区 | 欧美国产日韩一区二区三区 | 97视频资源| 麻豆视频在线观看免费 | 国产亚洲精品xxoo | 亚洲成人动漫在线观看 | 最新国产精品亚洲 | 天天激情站 | 婷婷综合伊人 | 91精品久久久久久久91蜜桃 | 91最新在线观看 | 在线成人一区二区 | www国产亚洲 | 天天摸天天舔天天操 | 一区二区欧美激情 | 久久露脸国产精品 | 黄色成人在线 | 毛片的网址 | 久久免费99 | 色wwwww| 一区二区三区四区久久 | 欧洲一区二区三区精品 | 亚洲综合视频网 | 久久不射网站 | 亚洲三级精品 | 免费在线激情电影 | 久草视频在线资源站 | 毛片网站免费在线观看 | 成人中心免费视频 | 国产精品视频不卡 | 久久午夜色播影院免费高清 | 久草五月 | 国产成人在线综合 | 成人黄色中文字幕 | 极品久久久久久久 | 国产手机在线播放 | 国产综合小视频 | 国产成人亚洲在线观看 | 99热国内精品 | 国产色久 | 精品视频免费观看 | www.五月婷婷| 亚洲视频综合 | av黄色影院 | 精品国产精品一区二区夜夜嗨 | 国产一级做a爱片久久毛片a | 国产精品视频观看 | 激情综合网在线观看 | 国产亚洲激情视频在线 | 国产成人亚洲在线电影 | 91中文字幕在线播放 | 一区国产精品 | 91麻豆精品国产自产在线 | 欧美一二区视频 | 91在线免费公开视频 | 最近高清中文字幕在线国语5 | 欧美激情视频在线观看免费 | 狠狠干天天 | 9草在线| 狠狠躁夜夜躁人人爽超碰97香蕉 | 成 人 黄 色 视频免费播放 | 久久精品日产第一区二区三区乱码 | 18女毛片| 黄色毛片在线 | 丁香婷婷综合激情五月色 | 国产小视频在线播放 | 在线天堂中文www视软件 | 激情婷婷六月 | 视频在线一区 | 国产成人av免费在线观看 | 999久久久 | 精品国产一区二区三区不卡 | 国产精品一区二区三区观看 | 欧美成人在线免费观看 | 99视频99 | 一级免费黄视频 | 91热爆在线观看 | 美女网站视频一区 | 久久深夜 | 亚洲高清av | 波多野结衣在线观看视频 | 在线观看一级 | 国产精品久久久久久久久久久久午夜 | 91香蕉视频在线下载 | 亚洲久在线| 香蕉影院在线播放 | 亚洲国产视频网站 | 国产精品一区二区在线免费观看 | 久久五月激情 | 国产精品免费一区二区三区 | 久久综合婷婷国产二区高清 | 91禁看片 | 麻豆果冻剧传媒在线播放 | 一区二区欧美在线观看 | 久久96国产精品久久99软件 | 欧美性精品 | 亚洲视频在线免费看 | 黄影院 | 日韩精品在线看 | 伊人资源视频在线 | 日韩电影在线观看一区 | 亚洲国产精品视频在线观看 | 日韩中文字幕免费在线观看 | 久久午夜视频 | 91资源在线| 亚洲欧洲精品一区二区 | 亚洲japanese制服美女 | 夜夜夜草| 黄www在线观看 | 午夜av剧场 | 91av电影在线观看 | 国产精品四虎 | 久久久久久久久综合 | 成人a在线观看 | 天天天综合 | 国产麻豆精品在线观看 | 午夜性生活 | 亚洲精品乱码久久久久久久久久 | 免费碰碰| 国产午夜三级一区二区三 | 最近日韩免费视频 | 精品国产乱码久久久久 | 精品久久一级片 | 精品在线观看一区二区三区 | 久久免费在线观看 | 亚洲综合小说 | 91av资源网 | 国产一区福利在线 | 国产精品一区二区av日韩在线 | 日韩精品视频在线观看网址 | 久草在线在线精品观看 | 中文字幕中文字幕在线中文字幕三区 | 黄色一级大片在线观看 | 国产无区一区二区三麻豆 | 国产欧美在线一区 | 成人h视频 | 91成人小视频 | 亚洲91精品| 欧美日韩精品区 | 西西444www | 91综合色 | 99热这里只有精品在线观看 | 欧美日韩国产精品爽爽 | 日韩电影在线观看一区二区三区 | 西西人体www444 | 97精品国产一二三产区 | 女女av在线 | 日韩a在线看| 婷婷伊人综合 | 天天射天| 亚洲精品一区二区18漫画 | 欧美精品资源 | 91视频在线播放视频 | 深夜免费小视频 | 精品国内自产拍在线观看视频 | 国产又粗又长又硬免费视频 | 免费av高清 | 国产成人精品av在线观 | 日韩极品视频在线观看 | 久久久国产精品一区二区中文 | 久久久久久久精 | 久久久久福利视频 | 天天干天天综合 | 久久久久国产一区二区三区 | 在线影视 一区 二区 三区 | 国产一在线精品一区在线观看 | 日韩特级毛片 | 久久亚洲私人国产精品 | 国产福利精品一区二区 | 在线精品视频免费播放 | 亚洲一区精品人人爽人人躁 | 天天综合导航 | 亚洲欧美经典 | av网站在线免费观看 | 免费看一级一片 | 国产91综合一区在线观看 |