lombok的@Accessors注解會導致JavaBean的setter規范問題


晚上在為一個工具類寫單元測試的時候發現了一個問題 :
lombok的@Accessors鏈式調用會破壞JavaBean的setter規范,從而導致使用java.beans中的PropertyDescriptor(屬性描述器)進行反射的時候回獲取不到的writeMethodRef的和writeMethodName的內容。

情況是這樣子的 :
我有一個用於測試的TargetModel 如下,加入了鏈式調用注解的@Accessors(chain = true)


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class TargetModel {

    private String name;
    private String email;

    @Override
    public String toString() {
        return JSON.toJSONString(this, SerializerFeature.WriteMapNullValue);
    }
}

編譯后的.class中的setName()將會類似於靜態工廠的Builder模式將自身返回,破壞了JavaBean的setter規范。

我在運行單元測試的進行調試的時候看到的PropertyDescriptor將獲取不到writeMethodRef的內容和writeMethodName


為了證實這個問題,我去掉了鏈式調用@Accessors。再次運行,發現問題已經解決:

最終結論 : 在可能會用到反射的JavaBean上面慎用鏈式調用@Accessors。否則PropertyDescriptor反射將獲取不到setter方法內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM