[英]How to get super fields in Lombok annotation handler
我想修改Lombok @ToString的格式,使其表現得像IDEA生成的toString代碼。 沒有可用的選項,因此我嘗試修改Lombok源代碼lombok.javac.handlers.HandleToString.java。 我想獲得父母的字段,直到Object然后將它們與“,”連接起來,但是我找不到實現它的方法。
現在,我只能通過遞歸和String.substring方法勉強地實現它,但是它不是很通用。 我修改后的Lombok的反編譯結果之一如下:
public String toString() {
String varSuperToString = super.toString();
int varStart = varSuperToString.indexOf("{") + 1;
int varEnd = varSuperToString.lastIndexOf("}");
String varSuperSub = "";
try {
varSuperSub = varSuperToString.substring(varStart, varEnd);
} catch (StringIndexOutOfBoundsException var6) {
}
if (!varSuperSub.isEmpty()) {
varSuperSub = varSuperSub + ", ";
}
return "NonEmptyChild_NonEmptyParent{" + varSuperSub + "email=" + this.email + ", " + "city=" + this.city + "}";
}
龍目島的toString:NonEmptyChild_NonEmptyParent(super = NonEmptyParent(id = 8,name = zfff),email=zfff@qq.com,city = bj)
但我要:NonEmptyChild_NonEmptyParent {id = 8,name = zfff,email=zfff@qq.com,city = bj}
我認為我需要獲取父母的字段,直到Lombok注釋處理器中的Object為止,但是我不知道如何獲取它們。 你能幫我嗎?
指定callSuper=true
以調用超類toString
@ToString(callSuper=true)
使用lombook注釋不能更改模式,如果需要任何模式更改,則必須覆蓋toString
,因為超類字段是非私有的,因此可以使用this
關鍵字直接訪問它們
@Override
public String toString() {
return "TestModel {id=" + this.id +"name= "+this.name+"email= "+this.email+"city= "+this.city+ "}";
}
如果您需要特定的toString方法,則完全不需要使用Lombok。 只需使用Intellij生成方法,根據您的需要對其進行修改,它將在您的Java程序中使用。 Lombok可以創建方法,但是如果您放置實現,則會尊重您的方法。
像Lombok這樣的注釋處理器只能訪問他們當前正在處理的編譯單元(即Java文件)。 他們無法訪問已處理單元的任何超類。 這意味着所有生成的代碼必須僅依賴於本地信息,因此超類的字段只能由超類的toString()
打印。
唯一的方法是使Lombok生成一些難看的字符串替換代碼,該代碼從super.toString()
調用的結果中刪除類名和括號。 但是您真的不應該這樣做。 (請記住,您還必須為Eclipse生成器和IntelliJ插件更改它。)
注意:如果還有其他依賴於您的toString()
實現,則應手動實現它以使其清晰。 如果不是這樣,那么使用不完美的格式比破解Lombok更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.