在 Eclipse Kepler 中制作 toString() 方法来打印继承的字段

make toString() method to print inherited fields too in Eclipse Kepler

我想为 class 扩展另一个方法生成 toString() 方法。但是在生成 toString() 对话框中,继承字段没有复选框(见下图)

这里有什么问题?

如果满足以下条件,Inherited fields 选项将会出现:

  • 您正在扩展具有可继承字段的 class,即 publicprotected(或在同一包中受包保护)
  • 当您的光标位于子项 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 中的字段。

如果您希望在某些情况下有不同的行为(不包括某些字段,不包括继承的字段等),您还可以稍微调整输出。