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