摘要:設(shè)置為,直接訪問字段,不調(diào)用此處列出的任何字段都不會(huì)在生成的和中使用。與相反,設(shè)置,失效添加注解,參考作用這個(gè)注解似乎沒有實(shí)在的作用,就是標(biāo)記這個(gè)類字段方法是自動(dòng)生成的作用生成寫在類上會(huì)生成該類下所有字段的。有點(diǎn)像的擴(kuò)展函數(shù)。
lombok版本:1.18.2前言
把lombok的注解過了一遍,發(fā)現(xiàn)有個(gè)@ExtensionMethod和kotlin的拓展函數(shù)有點(diǎn)類似
注解 @AllArgsConstructor作用
生成包含所有字段的構(gòu)造器
參數(shù)
staticName : 不為空的話,生成一個(gè)靜態(tài)方法返回實(shí)例,并把構(gòu)造器設(shè)置為private
@AllArgsConstructor(staticName = "create") public class Example { private int foo; private final String bar; }
生成:
public class Example { private int foo; private final String bar; private Example(int foo, String bar) { this.foo = foo; this.bar = bar; } public static Example create(int foo, String bar) { return new Example(foo, bar); } }
access : 構(gòu)造器訪問權(quán)限修飾符,默認(rèn)public
@Builder作用
生成構(gòu)建者(Builder)模式
例子:
@Builder public class Example { private int foo; private final String bar; }
生成:
public class Example { private int foo; private final String bar; Example(int foo, String bar) { this.foo = foo; this.bar = bar; } public static Example.ExampleBuilder builder() { return new Example.ExampleBuilder(); } public static class ExampleBuilder { private int foo; private String bar; ExampleBuilder() { } public Example.ExampleBuilder foo(int foo) { this.foo = foo; return this; } public Example.ExampleBuilder bar(String bar) { this.bar = bar; return this; } public Example build() { return new Example(this.foo, this.bar); } public String toString() { return "Example.ExampleBuilder(foo=" + this.foo + ", bar=" + this.bar + ")"; } } }
參數(shù)
builderMethodName : 創(chuàng)建構(gòu)建器實(shí)例的方法名稱
buildMethodName:構(gòu)建器類中創(chuàng)建構(gòu)造器實(shí)例的方法名稱
builderClassName:構(gòu)造器類名
toBuilder:生成toBuilder方法
例子
public Example.ExampleBuilder toBuilder() { return (new Example.ExampleBuilder()).foo(this.foo).bar(this.bar); }@Cleanup
作用
在變量上聲明@Cleanup,生成的代碼會(huì)把變量用try{}包圍,并在finallly塊中調(diào)用close()
例子
public class Example { public void copyFile(String in, String out) throws IOException { @Cleanup FileInputStream inStream = new FileInputStream(in); @Cleanup FileOutputStream outStream = new FileOutputStream(out); byte[] b = new byte[65536]; while (true) { int r = inStream.read(b); if (r == -1) break; outStream.write(b, 0, r); } } }
生成后:
public class Example { public Example() { } public void copyFile(String in, String out) throws IOException { FileInputStream inStream = new FileInputStream(in); try { FileOutputStream outStream = new FileOutputStream(out); try { byte[] b = new byte[65536]; while(true) { int r = inStream.read(b); if (r == -1) { return; } outStream.write(b, 0, r); } } finally { if (Collections.singletonList(outStream).get(0) != null) { outStream.close(); } } } finally { if (Collections.singletonList(inStream).get(0) != null) { inStream.close(); } } } }
參數(shù)
value:被在finally塊中調(diào)用的方法名,方法體不能帶有參數(shù),默認(rèn)為close
@Data作用
生成所有字段的getter、toString()、hashCode()、equals()、所有非final字段的setter、構(gòu)造器,相當(dāng)于設(shè)置了 @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode
例子
@Data public class Example { private int foo; private final String bar; }
生成:
public class Example { private int foo; private final String bar; public Example(String bar) { this.bar = bar; } public int getFoo() { return this.foo; } public String getBar() { return this.bar; } public void setFoo(int foo) { this.foo = foo; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Example)) { return false; } else { Example other = (Example)o; if (!other.canEqual(this)) { return false; } else if (this.getFoo() != other.getFoo()) { return false; } else { Object this$bar = this.getBar(); Object other$bar = other.getBar(); if (this$bar == null) { if (other$bar != null) { return false; } } else if (!this$bar.equals(other$bar)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof Example; } public int hashCode() { int PRIME = true; int result = 1; int result = result * 59 + this.getFoo(); Object $bar = this.getBar(); result = result * 59 + ($bar == null ? 43 : $bar.hashCode()); return result; } public String toString() { return "Example(foo=" + this.getFoo() + ", bar=" + this.getBar() + ")"; } }
作用
生成hashCode()、equals(),效果見@Data
參數(shù)
callSuper:是否調(diào)用父類的hashCode(),默認(rèn):false
doNotUseGetters:是否不調(diào)用字段的getter,默認(rèn)如果有g(shù)etter會(huì)調(diào)用。設(shè)置為true,直接訪問字段,不調(diào)用getter
exclude:此處列出的任何字段都不會(huì)在生成的equals和hashCode中使用。
of:與exclude相反,設(shè)置of,exclude失效
onParam:添加注解,參考@Getter#onMethod
@Generated作用
這個(gè)注解似乎沒有實(shí)在的作用,就是標(biāo)記這個(gè)類、字段、方法是自動(dòng)生成的
@Getter作用
生成getter、寫在類上會(huì)生成該類下所有字段的getter。寫在某個(gè)字段上就作用與該字段
參數(shù)
onMethod:把需要添加的注解寫在這
例子
public class Example { @Getter(onMethod_={@Deprecated}) // JDK7寫法 @Getter(onMethod=@__({@Deprecated})) private int foo; private final String bar = ""; }
生成:
public class Example { private int foo; private final String bar = ""; public Example() { } /** @deprecated */ @Deprecated public int getFoo() { return this.foo; } }
value:訪問權(quán)限修飾符
@NoArgsConstructor作用
生成無參數(shù)構(gòu)造器
參數(shù)
access:訪問權(quán)限修飾符
force:為true時(shí),強(qiáng)制生成構(gòu)造器,final字段初始化為null
onConstructor:添加注解,參考@Getter#onMethod
@NonNull作用
空檢查
例子
public class Example { @NonNull @Getter @Setter private Integer foo; }
生成后:
public class Example { @NonNull private Integer foo; public Example() { } @NonNull public Integer getFoo() { return this.foo; } public void setFoo(@NonNull Integer foo) { if (foo == null) { throw new NullPointerException("foo is marked @NonNull but is null"); } else { this.foo = foo; } } }@RequiredArgsConstructor
作用
生成必須初始化字段的構(gòu)造器,比如帶final、@NonNull
例子
@RequiredArgsConstructor public class Example { @NonNull private Integer foo; private final String bar; }
生成后:
public class Example { @NonNull private Integer foo; private final String bar; public Example(@NonNull Integer foo, String bar) { if (foo == null) { throw new NullPointerException("foo is marked @NonNull but is null"); } else { this.foo = foo; this.bar = bar; } } }@Setter
作用
生成Setter
參數(shù)
onMethod:在方法上添加中注解,見@Getter#onMethod
onParam:在方法的參數(shù)上添加注解,見@Getter#onMethod
value:訪問權(quán)限修飾符
@Singular作用
這個(gè)注解和@Builder一起使用,為Builder生成字段是集合類型的add方法,字段名不能是單數(shù)形式,否則需要指定value值
例子
@Builder public class Example { @Singular @Setter private Listfoos; }
生成:
public class Example { private List@SneakyThrowsfoos; Example(List foos) { this.foos = foos; } public static Example.ExampleBuilder builder() { return new Example.ExampleBuilder(); } public void setFoos(List foos) { this.foos = foos; } public static class ExampleBuilder { private ArrayList foos; ExampleBuilder() { } // 這方法是@Singular作用生成的 public Example.ExampleBuilder foo(Integer foo) { if (this.foos == null) { this.foos = new ArrayList(); } this.foos.add(foo); return this; } public Example.ExampleBuilder foos(Collection extends Integer> foos) { if (this.foos == null) { this.foos = new ArrayList(); } this.foos.addAll(foos); return this; } public Example.ExampleBuilder clearFoos() { if (this.foos != null) { this.foos.clear(); } return this; } public Example build() { List foos; switch(this.foos == null ? 0 : this.foos.size()) { case 0: foos = Collections.emptyList(); break; case 1: foos = Collections.singletonList(this.foos.get(0)); break; default: foos = Collections.unmodifiableList(new ArrayList(this.foos)); } return new Example(foos); } public String toString() { return "Example.ExampleBuilder(foos=" + this.foos + ")"; } } }
作用
用try{}catch{}捕捉異常
例子
public class Example { @SneakyThrows(UnsupportedEncodingException.class) public String utf8ToString(byte[] bytes) { return new String(bytes, "UTF-8"); } }
生成后:
public class Example { public Example() { } public String utf8ToString(byte[] bytes) { try { return new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException var3) { throw var3; } } }@Synchronized
作用
生成Synchronized(){}包圍代碼
例子
public class Example { @Synchronized public String utf8ToString(byte[] bytes) { return new String(bytes, Charset.defaultCharset()); } }
生成后:
public class Example { private final Object $lock = new Object[0]; public Example() { } public String utf8ToString(byte[] bytes) { Object var2 = this.$lock; synchronized(this.$lock) { return new String(bytes, Charset.defaultCharset()); } } }@ToString
作用
生成toString()方法
@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 ", entry.getKey(), entry.getValue()); } } }
生成后:
public class ValExample { public ValExample() { } public String example() { ArrayList@Valueexample = new ArrayList(); example.add("Hello, World!"); String foo = (String)example.get(0); return foo.toLowerCase(); } public void example2() { HashMap map = new HashMap(); map.put(0, "zero"); map.put(5, "five"); Iterator var2 = map.entrySet().iterator(); while(var2.hasNext()) { Entry entry = (Entry)var2.next(); System.out.printf("%d: %s ", entry.getKey(), entry.getValue()); } } }
作用
把類聲明為final,并添加toString()、hashCode()等方法,相當(dāng)于 @Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) @AllArgsConstructor @ToString @EqualsAndHashCode.
例子
@Value public class Example { private Integer foo; }
生成后:
public final class Example { private final Integer foo; public Example(Integer foo) { this.foo = foo; } public Integer getFoo() { return this.foo; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof Example)) { return false; } else { Example other = (Example)o; Object this$foo = this.getFoo(); Object other$foo = other.getFoo(); if (this$foo == null) { if (other$foo != null) { return false; } } else if (!this$foo.equals(other$foo)) { return false; } return true; } } public int hashCode() { int PRIME = true; int result = 1; Object $foo = this.getFoo(); int result = result * 59 + ($foo == null ? 43 : $foo.hashCode()); return result; } public String toString() { return "Example(foo=" + this.getFoo() + ")"; } }@var
作用
和val一樣,官方文檔中說區(qū)別就是var不加final修飾,但測(cè)試的效果是一樣的
Experimental注解在lombok.experimental包下@Accessors
作用
默認(rèn)情況下,沒什么作用,需要設(shè)置參數(shù)
參數(shù)
chain:為true時(shí),setter鏈?zhǔn)椒祷兀磗etter的返回值為this
fluent:為true時(shí),默認(rèn)設(shè)置chain為true,setter的方法名修改為字段名
@Delegate作用
代理模式,把字段的方法代理給類,默認(rèn)代理所有方法
參數(shù)
types:指定代理的方法
excludes:和types相反
例子
public class Example { private interface Add { boolean add(String x); boolean addAll(Collection extends String> x); } private @Delegate(types = Add.class) Liststrings; }
生成后:
public class Example { private List@ExtensionMethodstrings; public Example() { } public boolean add(String x) { return this.strings.add(x); } public boolean addAll(Collection extends String> x) { return this.strings.addAll(x); } private interface Add { boolean add(String var1); boolean addAll(Collection extends String> var1); } }
作用
拓展方法,向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型。有點(diǎn)像kotlin的擴(kuò)展函數(shù)。
例子
@ExtensionMethod({Arrays.class, Extensions.class}) public class Example { public static void main(String[] args) { int[] intArray = {5, 3, 8, 2}; intArray.sort(); int num = 1; num = num.increase(); Arrays.stream(intArray).forEach(System.out::println); System.out.println("num = " + num); } } class Extensions { public static int increase(int num) { return ++num; } }
生成后:
public class Example { public Example() { } public static void main(String[] args) { int[] intArray = new int[]{5, 3, 8, 2}; Arrays.sort(intArray); int num = 1; int num = Extensions.increase(num); IntStream var10000 = Arrays.stream(intArray); PrintStream var10001 = System.out; System.out.getClass(); var10000.forEach(var10001::println); System.out.println("num = " + num); } }
輸出:
2 3 5 8 num = 2@FieldDefaults
作用
定義類、字段的修飾符
參數(shù)
AccessLevel:訪問權(quán)限修飾符
makeFinal:是否加final
@FieldNameConstants作用
默認(rèn)生成一個(gè)常量,名稱為大寫字段名,值為字段名
參數(shù)
prefix:前綴
suffix:后綴
例子
public class Example { @FieldNameConstants(prefix = "PREFIX_", suffix = "_SUFFIX") private String foo; }
生成后:
public class Example { public static final String PREFIX_FOO_SUFFIX = "foo"; private String foo; public Example() { } }@Helper
作用
方法內(nèi)部的類方法暴露給方法使用
測(cè)試時(shí),maven編譯不通過。@NonFinal
作用
設(shè)置不為Final,@FieldDefaults和@Value也有這功能
@PackagePrivate作用
設(shè)置為private,@FieldDefaults和@Value也有這功能
@SuperBuilder @Tolerate @UtilityClass @Wither作用
生成withXXX方法,返回類實(shí)例
例子
@RequiredArgsConstructor public class Example { private @Wither final int foo; }
生成后:
public class Example { private final int foo; public Example(int foo) { this.foo = foo; } public Example withFoo(int foo) { return this.foo == foo ? this : new Example(foo); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76816.html
摘要:對(duì)語法樹的掃描,同樣提供了掃描器。詞法分析過程如下圖所示語法分析,即根據(jù)語法由序列生成抽象語法樹,對(duì)應(yīng)實(shí)現(xiàn)類為。生成的抽象語法樹如下圖所示的實(shí)現(xiàn)原理依賴開發(fā)的典型的第三方庫(kù)有,代碼自動(dòng)生成的和,代碼檢查的和,編譯階段完成依賴注入的等。 原文:http://nullwy.me/2017/04/java...如果覺得我的文章對(duì)你有用,請(qǐng)隨意贊賞 javac 是 Java 代碼的編譯器 [...
摘要:使用可以大大減少代碼行數(shù),提高開發(fā)效率。提供了日志工具無參構(gòu)造器提供方法提供方法方法有參構(gòu)造器,參數(shù)按屬性定義順序傳入提供了空指針檢測(cè),會(huì)拋出異常 lombok 是一個(gè)第三方工具,提供了一些注解功能,可以幫助我們消除冗余、臃腫的 Java 代碼,比如 POJO 的 getter/setter 方法、構(gòu)造方法、hashcode 方法等。lombok 在編譯時(shí)根據(jù)注解生成具體的代碼,在虛擬...
摘要:還提供了全部參數(shù)的構(gòu)造函數(shù)的自動(dòng)生成,該注解的作用域也是只有在實(shí)體類上,因?yàn)橹挥袑?shí)體類才會(huì)存在構(gòu)造函數(shù)。當(dāng)然除了全部參數(shù)的構(gòu)造函數(shù),還提供了沒有參數(shù)的構(gòu)造函數(shù),使用方式與一致。 Lombok對(duì)于Java偷懶開發(fā)者來說應(yīng)該是比較中意的,恰恰筆者就是一個(gè)喜歡在小細(xì)節(jié)上偷懶來提高開發(fā)效率的人。所以在技術(shù)框架的海洋里尋找了很久才在GitHub開源平臺(tái)上找到,而在這之前國(guó)外很多程序猿一直使用該框...
摘要:注意,其是在編譯源碼過程中,幫你自動(dòng)生成的。就是說,將極大減少你的代碼總量。注解和類似,區(qū)別在于它會(huì)把所有成員變量默認(rèn)定義為修飾,并且不會(huì)生成方法。不同的日志注解總結(jié)如下上面是注解,下面是編譯后的代碼參考資料下的安裝以及使用簡(jiǎn)介注解介紹 Lombok有什么用 在我們實(shí)體Bean中有大量的Getter/Setter方法以及toString, hashCode等可能不會(huì)用到,但是某些時(shí)候仍...
摘要:注解在類上為類提供一個(gè)全參的構(gòu)造方法,加了這個(gè)注解后,類中不提供默認(rèn)構(gòu)造方法了。這個(gè)注解用在類上,使用類中所有帶有注解的或者帶有修飾的成員變量生成對(duì)應(yīng)的構(gòu)造方法。 轉(zhuǎn)載請(qǐng)注明原創(chuàng)地址:http://www.54tianzhisheng.cn/2018/01/07/lombok/ showImg(http://ohfk1r827.bkt.clouddn.com/blog/180107/7...
閱讀 2671·2023-04-25 18:10
閱讀 1606·2019-08-30 15:53
閱讀 2789·2019-08-30 13:10
閱讀 3216·2019-08-29 18:40
閱讀 1128·2019-08-23 18:31
閱讀 1201·2019-08-23 16:49
閱讀 3400·2019-08-23 16:07
閱讀 877·2019-08-23 15:27