在 Eclipse Kepler 中制作 toString() 方法来打印继承的字段
make toString() method to print inherited fields too in Eclipse Kepler
我想为 class 扩展另一个方法生成 toString() 方法。但是在生成 toString() 对话框中,继承字段没有复选框(见下图)
这里有什么问题?
如果满足以下条件,Inherited fields
选项将会出现:
- 您正在扩展具有可继承字段的 class,即
public
、protected
(或在同一包中受包保护)
- 当您的光标位于子项 class
中时,您正在根据上下文生成 toString
方法以进行右键单击
后者可能会造成混淆:决定应为哪个 class 生成 toString
(等)方法的不是您右键单击的位置,而是您实际光标所在的位置.
您必须在超类中编写一个 toString()
方法,然后您需要 select 继承的方法和 select toString()
那里。
我知道这有点离题,但有人可能更喜欢下面的代码:
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();
}
有点晚了,但请考虑使用 ToStringBuilder class in the Apache Commons 库中的 reflectionToString
方法,而不是为每个 class 实现您自己的 toString
方法。你可以这样使用它:
public String toString() {
ToStringBuilder.reflectionToString(this)
}
它将根据您 class 中的所有字段动态生成 String
,包括任何超级classes 中的字段。
如果您希望在某些情况下有不同的行为(不包括某些字段,不包括继承的字段等),您还可以稍微调整输出。
我想为 class 扩展另一个方法生成 toString() 方法。但是在生成 toString() 对话框中,继承字段没有复选框(见下图)
这里有什么问题?
如果满足以下条件,Inherited fields
选项将会出现:
- 您正在扩展具有可继承字段的 class,即
public
、protected
(或在同一包中受包保护) - 当您的光标位于子项 class 中时,您正在根据上下文生成
toString
方法以进行右键单击
后者可能会造成混淆:决定应为哪个 class 生成 toString
(等)方法的不是您右键单击的位置,而是您实际光标所在的位置.
您必须在超类中编写一个 toString()
方法,然后您需要 select 继承的方法和 select toString()
那里。
我知道这有点离题,但有人可能更喜欢下面的代码:
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();
}
有点晚了,但请考虑使用 ToStringBuilder class in the Apache Commons 库中的 reflectionToString
方法,而不是为每个 class 实现您自己的 toString
方法。你可以这样使用它:
public String toString() {
ToStringBuilder.reflectionToString(this)
}
它将根据您 class 中的所有字段动态生成 String
,包括任何超级classes 中的字段。
如果您希望在某些情况下有不同的行为(不包括某些字段,不包括继承的字段等),您还可以稍微调整输出。