当前位置: 首页 > 面试题库 >

Java:获取类的属性以构造字符串表示形式

阎雪峰
2023-03-14
问题内容

假设我有一个这样的类(并进一步假设所有私有变量:

public class Item {
    private String _id = null;
    private String _name = null;
    private String _description = null;

        ...
}

现在,如果要构建此类的toString()表示形式,则可以在Item类中执行以下操作:

@Override
public String toString() {
    return (_id + " " + _name + " " + _description);
}

但是,如果我在类中说了15个私有变量,该怎么办?我是否需要像这样写出每个变量的名称?

理想情况下,我想遍历该类的私有变量列表并构造字符串表示形式来结束任务:

@Override
public String toString() {
    ArrayList<String> members = getClass().getMembers(); //Some method like this
    String string = "";
    for(...)
        string += members[i] + " ";
}

也许是toJSON方法,我仍然需要访问这些变量的名称。有什么建议?


问题答案:

您可以这样做:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(getClass().getName());
  sb.append(": ");
  for (Field f : getClass().getDeclaredFields()) {
    sb.append(f.getName());
    sb.append("=");
    sb.append(f.get(this));
    sb.append(", ");
  }
  return sb.toString();
}

不要
使用字符串串联来构造15个数据成员的最终结果,特别是如果toString()将调用很多。内存碎片和开销可能确实很高。使用StringBuilder构建大动态的字符串。

我通常让我的IDE(IntelliJ)toString()为我简单地生成方法,而不是为此使用反射。

另一种有趣的方法是使用Project
Lombok中
的@ToString批注:

import lombok.ToString;

@ToString(excludes="id")
public class ToStringExample {
  private static final int STATIC_VAR = 10;
  private String name;
  private Shape shape = new Square(5, 10);
  private String[] tags;
  private int id;

  @ToString(callSuper=true, includeFieldNames=true)
  public static class Square extends Shape {
    private final int width, height;

    public Square(int width, int height) {
      this.width = width;
      this.height = height;
    }
  }
}

我发现这比Jakarta Commons toString构建器更可取,因为这种方法具有更高的可配置性,并且也是在编译时而非运行时构建的。



 类似资料:
  • 问题内容: 假设我定义了以下类型: 我将如何以编程方式将类型作为字符串获取,因此以后可能很容易重构,而不是: 我不太喜欢,因为它实例化了它,也可以从Interface实例化。 问题答案: 您可以使用包装(包装也可以在内部使用)。您可以从 指向 该类型的 指针 开始,并使用没有分配的 类型化_指针值,并且可以使用来从其描述符导航到指针的 _基本 类型(或 元素 类型)的描述符。 例: 输出(在Go

  • 我想在JComboBoxe中显示我的名为CodeA(类型为String)的变量中的每个项。我有一条错误消息: 我不明白和之间的转换 编辑:在此处输入图像描述

  • 问题内容: 我有一个C python扩展名,我想打印一些诊断信息。 我收到一个字符串作为PyObject *。 获取此对象的字符串表示形式(使其可用作const char *)的规范方法是什么? 更新: 澄清以强调访问为const char *。 问题答案: 使用(模仿Python的函数)或(模仿),然后调用get (您可以并且通常应该将其用作,例如: 任何人都可以使用此方法。如果您完全确定是Py

  • 问题内容: 对于我的应用程序,字符串是否为人类可读的都没有关系。 问题答案: 将结构编码为字符串的一种流行方法是使用JSON。 您有某些限制,例如无法获取所有信息(例如,每个字段的特定类型),仅序列化导出的字段以及不处理递归值。但这是序列化数据的简单标准方法。 工作示例: 给出以下输出: https://play.golang.org/p/sx-xdSxAOG

  • 问题内容: 如何在基于字符串的PHP中获取属性?我给它打电话。那是什么? 就像… 问题答案: 像这样 或者,如果您可以控制该类,请实现ArrayAccess接口,然后执行此操作

  • 如果我有一个子类,如何将类名获取为string?我试过做,但这会返回对象,而不是。