Java中@Accessors注解的具體使用
前言
關(guān)于該注解的學(xué)習(xí),主要來(lái)源項(xiàng)目中涉及,對(duì)此進(jìn)行查漏補(bǔ)缺
@Accessors 注解通常用于簡(jiǎn)化實(shí)體類(lèi)的代碼,使其更加簡(jiǎn)潔和易讀。
1. 概念
@Accessors 是 Lombok(一種Java庫(kù))提供的注解之一,用于自動(dòng)生成 getter 和 setter 方法,并可以配置一些屬性。
以下是關(guān)于 @Accessors 注解的詳細(xì)解釋
常用屬性:
- fluent:如果設(shè)置為 true,生成的 getter 方法會(huì)移除 get 前綴,setter 方法移除 set 前綴。
- chain:如果設(shè)置為 true,生成的 setter 方法會(huì)返回當(dāng)前對(duì)象,支持方法鏈調(diào)用。
- prefix:為生成的 getter 和 setter 方法添加指定前綴。
類(lèi)似如下例子:
import lombok.AccessLevel;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
@ToString
@Accessors(chain = true, fluent = true)
public class Example {
@Setter(AccessLevel.PROTECTED)
private String name;
private int age;
}
在上面的例子中,@Accessors 注解配置了 chain = true 和 fluent = true,表示生成的 setter 方法支持方法鏈調(diào)用,并移除了 get 和 set 前綴。
通過(guò)源碼也可看出其配置的屬性:
/**
* A container for settings for the generation of getters and setters.
* <p>
* Complete documentation is found at <a rel="external nofollow" >the project lombok features page for @Accessors</a>.
* <p>
* Using this annotation does nothing by itself; an annotation that makes lombok generate getters and setters,
* such as {@link lombok.Setter} or {@link lombok.Data} is also required.
*/
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface Accessors {
/**
* If true, accessors will be named after the field and not include a {@code get} or {@code set}
* prefix. If true and {@code chain} is omitted, {@code chain} defaults to {@code true}.
* <strong>default: false</strong>
*
* @return Whether or not to make fluent methods (named {@code fieldName()}, not for example {@code setFieldName}).
*/
boolean fluent() default false;
/**
* If true, setters return {@code this} instead of {@code void}.
* <strong>default: false</strong>, unless {@code fluent=true}, then <strong>default: true</strong>
*
* @return Whether or not setters should return themselves (chaining) or {@code void} (no chaining).
*/
boolean chain() default false;
/**
* If present, only fields with any of the stated prefixes are given the getter/setter treatment.
* Note that a prefix only counts if the next character is NOT a lowercase character or the last
* letter of the prefix is not a letter (for instance an underscore). If multiple fields
* all turn into the same name when the prefix is stripped, an error will be generated.
*
* @return If you are in the habit of prefixing your fields (for example, you name them {@code fFieldName}, specify such prefixes here).
*/
String[] prefix() default {};
}
2. 屬性
默認(rèn)fluent、chain 都是false
對(duì)于false,其設(shè)定的值跟往常差不多!
舉例如下:(主要為了區(qū)分fluent、chain以及prefix三個(gè)屬性)
@Data
//@AllArgsConstructor
//@NoArgsConstructor
@TableName("test_user1")
@Accessors(chain = false,fluent = false)
public class User1 {
@TableId(value = "id", type = IdType.AUTO)
private int xxId;
private String yyUserName;
private int zzAge;
// 其他字段...
public static void main(String[] args) {
User1 user1 = new User1();
user1.setXxId(123);
user1.setYyUserName("manong");
user1.setZzAge(123);
System.out.println(user1); // User1(xxId=123, yyUserName=manong, zzAge=123)
System.out.println(user1.getZzAge()); // 123
}
}
截圖如下:

2.1 fluent屬性
為了方便測(cè)試,原先f(wàn)luent默認(rèn)就是false,當(dāng)修改為true的時(shí)候:
@Data
@TableName("test_user1")
@Accessors(fluent = true)
public class User1 {
@TableId(value = "id", type = IdType.AUTO)
private int id;
private String username;
private int age;
// 其他字段...
public static void main(String[] args) {
User1 user1 = new User1();
System.out.println(user1.id()); // 這個(gè)返回的值是int值,因?yàn)閕d為int類(lèi)型
System.out.println(user1.id(123)); // 這個(gè)返回的對(duì)象值是類(lèi)
System.out.println(user1.id()); // 再次看看id的屬性為,123
System.out.println(user1.age()); // 查看其age屬性,發(fā)現(xiàn)為0
}
}
截圖如下:

對(duì)應(yīng)的屬性有如下:
- 返回屬性值
- 返回對(duì)象
可以通過(guò)得到對(duì)象再去檢查其他的屬性:

2.2 chain屬性
chain的區(qū)別在于可以鏈?zhǔn)皆O(shè)定值!
代碼如下:
@Data
@TableName("test_user1")
@Accessors(chain = true)
public class User1 {
@TableId(value = "id", type = IdType.AUTO)
private int id;
private String username;
private int age;
// 其他字段...
public static void main(String[] args) {
User1 user1 = new User1();
// System.out.println(user1.setId(123)); // 返回對(duì)象
user1.setAge(123).setUsername("manong");
System.out.println(user1); // User1(id=0, username=manong, age=123)
System.out.println(user1.getAge()); // 123
User1 user2 = new User1().setAge(333).setUsername("yanjiuseng");
System.out.println(user2); // User1(id=0, username=yanjiuseng, age=333)
}
}
截圖如下:

2.3 prefix屬性
注意屬性中的前綴后要開(kāi)頭大寫(xiě)!此處的前綴必須為string類(lèi)型
比如id屬性,為了加一個(gè)前綴xx,則屬性值應(yīng)該為xxId,如果為xxid代碼會(huì)錯(cuò)!
代碼如下:
@Data
@TableName("test_user1")
@Accessors(prefix = {"xx","yy","zz"})
public class User1 {
@TableId(value = "id", type = IdType.AUTO)
private int xxId;
private String yyUserName;
private int zzAge;
// 其他字段...
public static void main(String[] args) {
User1 user1 = new User1();
user1.setId(123);
user1.setUserName("manong");
user1.setAge(123);
System.out.println(user1); // User1(xxId=123, yyUserName=manong, zzAge=123)
System.out.println(user1.getAge()); // 123
}
}
截圖如下:

到此這篇關(guān)于Java中@Accessors注解的具體使用的文章就介紹到這了,更多相關(guān)Java @Accessors注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaSE程序邏輯控制實(shí)現(xiàn)詳細(xì)圖文教程
JavaSE是為了開(kāi)發(fā)桌面應(yīng)用程序和控制臺(tái)應(yīng)用程序而設(shè)計(jì)的,使用JavaSE可以編寫(xiě)?yīng)毩⑦\(yùn)行的Java應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于JavaSE程序邏輯控制實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-04-04
Java 泛型詳解之類(lèi)型參數(shù)的力量(最新推薦)
本文系統(tǒng)講解了Java泛型的定義、使用、通配符、邊界及常見(jiàn)陷阱,強(qiáng)調(diào)了泛型在Java編程中的重要性,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-10-10
Java面試題沖刺第六天--網(wǎng)絡(luò)編程1
這篇文章主要為大家分享了最有價(jià)值的三道網(wǎng)絡(luò)編程面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-07-07
RocketMQ?Broker消息如何刷盤(pán)源碼解析
這篇文章主要為大家介紹了RocketMQ?Broker消息如何刷盤(pán)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式
這篇文章主要介紹了java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
JAVA進(jìn)階之HashMap底層實(shí)現(xiàn)解析
Hashmap是java面試中經(jīng)常遇到的面試題,大部分都會(huì)問(wèn)其底層原理與實(shí)現(xiàn),為了能夠溫故而知新,特地寫(xiě)了這篇文章,以便時(shí)時(shí)學(xué)習(xí)2021-11-11
Java源碼解析重寫(xiě)鎖的設(shè)計(jì)結(jié)構(gòu)和細(xì)節(jié)
這篇文章主要為大家介紹了Java源碼解析重寫(xiě)鎖的設(shè)計(jì)結(jié)構(gòu)和細(xì)節(jié),這小節(jié)我們以共享鎖作為案列,自定義一個(gè)共享鎖。有需要的朋友可以借鑒參考下2022-03-03
springsecurity記住我登錄時(shí)訪問(wèn)無(wú)權(quán)限接口跳轉(zhuǎn)登錄界面的處理方案
這篇文章主要介紹了springsecurity記住我登錄時(shí)訪問(wèn)無(wú)權(quán)限接口跳轉(zhuǎn)登錄界面的處理方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-02-02

