如何打印java对象而不获取“sometype@2f92e0f4"?

zf2sa74q  于 2021-07-13  发布在  Java
关注(0)|答案(10)|浏览(445)

我有一个类定义如下:

  1. public class Person {
  2. private String name;
  3. // constructor and getter/setter omitted
  4. }

我试图打印我的类的一个示例:

  1. System.out.println(myPerson);

但我得到了以下结果: com.foo.Person@2f92e0f4 .
当我试图打印一组 Person 物体:

  1. Person[] people = //...
  2. System.out.println(people);

我得到了结果: [Lcom.foo.Person;@28a418fc 这个输出意味着什么?如何更改此输出以使其包含我的人名?如何打印我的物品集?
注:这是一个关于这个主题的规范问答。

agyaoht7

agyaoht71#

在intellij中,可以通过按alt+inset,然后选择tostring()来自动生成tostring方法这里是测试类的输出:

  1. public class test {
  2. int a;
  3. char b;
  4. String c;
  5. Test2 test2;
  6. @Override
  7. public String toString() {
  8. return "test{" +
  9. "a=" + a +
  10. ", b=" + b +
  11. ", c='" + c + '\'' +
  12. ", test2=" + test2 +
  13. '}';
  14. }
  15. }

如您所见,它通过连接类的几个属性来生成字符串,对于原语,它将打印它们的值,对于引用类型,它将使用它们的类类型(在本例中是test2的string方法)。

展开查看全部
yv5phkfx

yv5phkfx2#

默认情况下,java中的每个对象都有 toString() 输出objecttype@hashcode.
如果你想要更多有意义的完整信息,那么你需要覆盖 toString() 你班上的方法。

  1. public class Person {
  2. private String name;
  3. // constructor and getter/setter omitted
  4. // overridding toString() to print name
  5. public String toString(){
  6. return name;
  7. }
  8. }

现在,当您使用 System.out.prtinln(personObj); 它将打印人员的姓名,而不是类名和哈希代码。
在第二种情况下,当您试图打印数组时,它会打印 [Lcom.foo.Person;@28a418fc 数组类型及其哈希代码。
如果你想打印人名,有很多方法。
您可以编写自己的函数来迭代每个人并打印

  1. void printPersonArray(Person[] persons){
  2. for(Person person: persons){
  3. System.out.println(person);
  4. }
  5. }

可以使用arrays.tostring()打印它。对我来说这似乎是最简单的。

  1. System.out.println(Arrays.toString(persons));
  2. System.out.println(Arrays.deepToString(persons)); // for nested arrays

您可以用java8方式打印它(使用流和方法引用)。

  1. Arrays.stream(persons).forEach(System.out::println);

也许还有其他方法。希望这有帮助。:)

展开查看全部
tjjdgumg

tjjdgumg3#

如果你直接打印任何对象的人,它将 ClassName@HashCode 按密码。
对你来说 com.foo.Person@2f92e0f4 正在打印。哪里 Person 是对象所属的类,并且 2f92e0f4 是对象的哈希代码。

  1. public class Person {
  2. private String name;
  3. public Person(String name){
  4. this.name = name;
  5. }
  6. // getter/setter omitted
  7. @override
  8. public String toString(){
  9. return name;
  10. }
  11. }

如果你想用 Person 然后它会打印名字

  1. Class Test
  2. {
  3. public static void main(String... args){
  4. Person obj = new Person("YourName");
  5. System.out.println(obj.toString());
  6. }
  7. }
展开查看全部
x7yiwoj4

x7yiwoj44#

如果您查看对象类(java中所有类的父类),那么tostring()方法的实现是

  1. public String toString() {
  2. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3. }

无论何时在java中打印任何对象,都会调用tostring()。现在由您决定是否重写tostring(),然后您的方法将调用其他对象类方法调用。

6pp0gazn

6pp0gazn5#

我成功地用 Jackson Spring5号。根据对象的不同,jackson可能不会在所有情况下都起作用。

  1. import com.fasterxml.jackson.databind.ObjectMapper;
  2. import com.fasterxml.jackson.databind.SerializationFeature;
  3. ObjectMapper mapper = new ObjectMapper();
  4. Staff staff = createStaff();
  5. // pretty print
  6. String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff);
  7. System.out.println("-------------------------------------------------------------------")
  8. System.out.println(json);
  9. System.out.println("-------------------------------------------------------------------")

输出类似于

  1. -------------------------------------------------------------------
  2. {
  3. "id" : 1,
  4. "internalStaffId" : "1",
  5. "staffCms" : 1,
  6. "createdAt" : "1",
  7. "updatedAt" : "1",
  8. "staffTypeChange" : null,
  9. "staffOccupationStatus" : null,
  10. "staffNote" : null
  11. }
  12. -------------------------------------------------------------------

更多示例使用 Jackson 在这里
你可以试试 GSON 也。应该是这样的:

  1. Gson gson = new Gson();
  2. System.out.println(gson.toJson(objectYouWantToPrint).toString());
展开查看全部
ttcibm8c

ttcibm8c6#

背景

所有java对象都有一个 toString() 方法,该方法在您尝试打印对象时调用。

  1. System.out.println(myObject); // invokes myObject.toString()

此方法在 Object 类(所有java对象的超类)。这个 Object.toString() 方法返回一个相当难看的字符串,由类名和 @ 十六进制中对象的符号和哈希代码。代码如下所示:

  1. // Code of Object.toString()
  2. public String toString() {
  3. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  4. }

结果,例如 com.foo.MyType@2f92e0f4 因此可以解释为: com.foo.MyType -类的名称,即类是 MyType 在包裹里 com.foo . @ -把绳子连在一起 2f92e0f4 对象的哈希代码。
数组类的名称看起来有点不同,这在javadocs中有很好的解释 Class.getName() . 例如, [Ljava.lang.String 指: [ -一维数组(相对于 [[ 或者 [[[ 等等) L -数组包含类或接口 java.lang.String -数组中对象的类型

自定义输出

打电话的时候打印一些不同的东西 System.out.println(myObject) ,必须重写 toString() 方法。下面是一个简单的例子:

  1. public class Person {
  2. private String name;
  3. // constructors and other methods omitted
  4. @Override
  5. public String toString() {
  6. return name;
  7. }
  8. }

现在如果我们打印一张 Person ,我们看到他们的名字而不是 com.foo.Person@12345678 .
记住 toString() 只是将对象转换为字符串的一种方法。通常,这个输出应该以清晰简洁的方式完整地描述您的对象。更好的 toString() 为了我们的 Person 类可能是:

  1. @Override
  2. public String toString() {
  3. return getClass().getSimpleName() + "[name=" + name + "]";
  4. }

例如。, Person[name=Henry] . 这对于调试/测试来说是非常有用的数据。
如果您只想关注对象的一个方面或包含大量的jazzy格式,那么最好定义一个单独的方法。 String toElegantReport() {...} .

自动生成输出

许多ide都支持自动生成 toString() 方法,基于类中的字段。例如,参见eclipse和intellij的文档。
一些流行的java库也提供了这个特性。一些例子包括: ToStringBuilder 来自apache commons lang MoreObjects.ToStringHelper 来自谷歌Guava @ToString Lombok湖项目注解

打印对象组

所以你创造了一个很好的 toString() 为了你们班。如果将该类放入数组或集合中会发生什么?

数组

如果有对象数组,可以调用 Arrays.toString() 生成数组内容的简单表示。例如,考虑以下数组 Person 物体:

  1. Person[] people = { new Person("Fred"), new Person("Mike") };
  2. System.out.println(Arrays.toString(people));
  3. // Prints: [Fred, Mike]

注意:这是对静态方法的调用 toString() 在arrays类中,这与我们上面讨论的不同。
如果有多维数组,可以使用 Arrays.deepToString() 达到同样的输出。

收藏

大多数集合都会基于调用生成漂亮的输出 .toString() 在每个元素上。

  1. List<Person> people = new ArrayList<>();
  2. people.add(new Person("Alice"));
  3. people.add(new Person("Bob"));
  4. System.out.println(people);
  5. // Prints [Alice, Bob]

所以你只需要确保你的列表元素定义了一个好的 toString() 如上所述。

展开查看全部
euoag5mw

euoag5mw7#

我认为apache提供了一个更好的util类,它提供了一个获取字符串的函数

  1. ReflectionToStringBuilder.toString(object)
s4chpxco

s4chpxco8#

java中的每个类都有 toString() 方法,如果您将该类的某个对象传递给 System.out.println() . 默认情况下,此调用返回classname@hashcode 那个物体的形状。

  1. {
  2. SomeClass sc = new SomeClass();
  3. // Class @ followed by hashcode of object in Hexadecimal
  4. System.out.println(sc);
  5. }

可以重写类的tostring方法以获得不同的输出。看这个例子

  1. class A {
  2. String s = "I am just a object";
  3. @Override
  4. public String toString()
  5. {
  6. return s;
  7. }
  8. }
  9. class B {
  10. public static void main(String args[])
  11. {
  12. A obj = new A();
  13. System.out.println(obj);
  14. }
  15. }
展开查看全部
eaf3rand

eaf3rand9#

在eclipse中,转到类,右键单击->源->生成 toString() ;
它将覆盖 toString() 方法并将打印该类的对象。

y3bcpkx1

y3bcpkx110#

我更喜欢使用一个实用函数,它使用gson将java对象反序列化为json字符串。

  1. /**
  2. * This class provides basic/common functionalities to be applied on Java Objects.
  3. */
  4. public final class ObjectUtils {
  5. private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
  6. private ObjectUtils() {
  7. throw new UnsupportedOperationException("Instantiation of this class is not permitted in case you are using reflection.");
  8. }
  9. /**
  10. * This method is responsible for de-serializing the Java Object into Json String.
  11. *
  12. * @param object Object to be de-serialized.
  13. * @return String
  14. */
  15. public static String deserializeObjectToString(final Object object) {
  16. return GSON.toJson(object);
  17. }
  18. }
展开查看全部

相关问题