簡體   English   中英

如何在Lombok注釋處理程序中獲取超級字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM