如何在Lombok注释处理程序中获取超级字段

时间:2019-07-29 12:17:35

标签: java lombok

我想修改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为止,但是我不知道如何获得它们。你能帮我吗?

3 个答案:

答案 0 :(得分:1)

指定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+ "}";
}

答案 1 :(得分:1)

如果您需要特定的toString方法,则完全不需要使用Lombok。只需使用Intellij生成方法,根据您的需要对其进行修改,它将在您的Java程序中使用。 Lombok可以创建方法,但是如果您放置实现,则会尊重您的方法。

答案 2 :(得分:1)

像Lombok这样的注释处理器只能访问他们当前正在处理的编译单元(即Java文件)。他们无法访问已处理单元的任何超类。这意味着所有生成的代码必须仅依赖于本地信息,因此超类的字段只能由超类的toString()打印。

唯一的方法是使Lombok生成一些难看的字符串替换代码,该代码从super.toString()调用的结果中删除类名和括号。但是您真的不应该这样做。 (请记住,您还必须为Eclipse生成器和IntelliJ插件更改它。)

注意:如果您的toString()实现依赖于其他条件,则应手动实现它以使其清晰可见。如果不是这样,那么使用不完美的格式比破解Lombok更好。