晚上在為一個工具類寫單元測試的時候發現了一個問題 :
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方法內容。