我想为扩展另一个的类生成toString()方法。但是在生成toString()对话框中,没有用于继承字段的复选框(参见下图)
这里的问题是什么?
答案 0 :(得分:6)
Inherited fields
选项如果出现:
public
,protected
(或在同一个包中保护包)toString
方法后者可能令人困惑:它不是您右键单击的位置,而是您的实际光标所在的位置,它决定了应该生成toString
(等)方法的类。
答案 1 :(得分:3)
您必须在超类中编写toString()
方法,然后您需要选择继承的方法并在那里选择toString()
。
答案 2 :(得分:2)
迟到了,但考虑在ToStringBuilder class in the Apache Commons库中使用reflectionToString
方法,而不是为每个类实现自己的toString
方法。您可以像这样使用它:
public String toString() {
ToStringBuilder.reflectionToString(this)
}
它会根据您班级中的所有字段动态生成String
,包括任何超类中的字段。
如果您想要某些情况下的不同行为(不包括某些字段,不包括继承的字段等),您还可以稍微调整输出。
答案 3 :(得分:1)
我知道这有点偏离主题,但有人可能更喜欢以下代码:
public String toString() {
StringBuilder toReturn = new StringBuilder("\r\n-------------\r\n");
Class<?> c = this.getClass();
toReturn.append(c.getName()).append("\r\n");
Method[] methods = c.getMethods();
for (Method method : methods) {
if (method.getName().startsWith("get") && !method.getName().equals("getClass")) {
Object obj = new String("no value");
try {
obj = method.invoke(this, (Object[]) null);
} catch (Throwable e) {
}
toReturn.append(method.getName()).append(" -> ").append(obj).append("\r\n");
}
}
toReturn.append("-------------\r\n");
return toReturn.toString();
}