How do I print my Java object without getting “SomeType@2f92e0f4”?
我有一个类定义如下:
1 2 3 4 5 |
我试图打印我的类的一个实例:
1 |
但我得到了以下输出:
当我试图打印一组
1 2 |
我得到了输出:
这个输出是什么意思?如何更改此输出,使其包含我的人员姓名?如何打印对象的集合?
注意:这是一个关于此主题的规范问题。
背景
所有Java对象都有一个EDCOX1×0的方法,当您尝试打印对象时,该方法被调用。
1 |
这个方法是在EDCOX1的1个类(所有Java对象的超类)中定义的。
1 2 3 4 |
因此,诸如
com.foo.MyType —类的名称,即包com.foo 中的类是MyType 。@ —将字符串连接在一起2f92e0f4 对象的散列码。
数组类的名称看起来有点不同,这在用于
[ —一维阵列(与[[ 或[[[ 等相反)。L —数组包含类或接口java.lang.String —数组中对象的类型
自定义输出
要在调用
1 2 3 4 5 6 7 8 9 10 11 |
现在,如果我们打印一个
记住,
1 2 3 4 |
打印,如
如果您只想关注对象的一个方面或包含大量时髦的格式,那么最好定义一个单独的方法,例如
许多IDE都支持基于类中的字段自动生成
几个流行的Java库也提供了这个特性。一些例子包括:
阿帕奇公地语言的
ToStringBuilder 。google guava的
MoreObjects.ToStringHelper Lombok项目
@ToString 注释
打印对象组
所以你为你的班级创建了一个不错的
如果您有一个对象数组,可以调用
1 2 3 4 |
注意:这是对数组类中名为
如果您有一个多维数组,那么可以使用
大多数集合将在对每个元素调用
1 2 3 4 5 6 | List<Person> people = new ArrayList<>(); people.add(new Person("Alice")); people.add(new Person("Bob")); System.out.println(people); // Prints [Alice, Bob] |
因此,您只需要确保您的列表元素定义一个不错的
我认为Apache提供了一个更好的util类,它提供了一个函数来获取字符串
1 | ReflectionToStringBuilder.toString(object) |
Java中的每一个类默认都有EDCOX1 0的方法,如果将该类的某个对象传递给EDCOX1,38,则称为EDCOX1。默认情况下,此调用返回该对象的classname@hashcode。
1 2 3 4 5 | { SomeClass sc = new SomeClass(); // Class @ followed by hashcode of object in Hexadecimal System.out.println(sc); } |
可以重写类的ToString方法以获得不同的输出。请参阅此示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
在Eclipse,上你的课,右击->来源->生成
它将重写
默认的模式,在每一
如果你想要更多的信息,那么你meaningfull need to the method
1 2 3 4 5 6 7 8 9 10 |
现在,当你使用the person对象打印页打印
二是在你的房子当你想打印页打印数组,数组的
如果你想打印the names there are many person,方式。P></
你可以写你自己的函数,迭代和打印每个人P></
1 2 3 4 5 | void printPersonArray(Person[] persons){ for(Person person: persons){ System.out.println(person); } } |
你可以打印使用arrays.tostring(EN)。这似乎对我的茶扩。P></
1 2 |
你可以打印方式(using the Java / 8和参考streams method)。P></
there might be other方式为好。本helps希望。):P></
你可以在自动生成IntelliJ ToString方法模式选择插入,然后按ALT + toString()是安放在试验班:out for aP></
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
As You can see,恩generates模式连接字符串属性,several of the class,它将打印primitives for their values and for their参考EN将使用类型类型(method of this to字符串房屋test2)。P></
使用效用函数在所有可能的uses gson to which the Java对象序列化的JSON字符串"。P></
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** * This class provides basic/common functionalities to be applied on Java Objects. */ public final class ObjectUtils { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private ObjectUtils() { throw new UnsupportedOperationException("Instantiation of this class is not permitted in case you are using reflection."); } /** * This method is responsible for de-serializing the Java Object into Json String. * * @param object Object to be de-serialized. * @return String */ public static String deserializeObjectToString(final Object object) { return GSON.toJson(object); } } |
如果您直接打印任何人的对象,它会将
在您的情况下,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
现在,如果您试图使用
1 2 3 4 5 6 7 |
如果你看看(parent of the object类的类在Java类的toString()方法执行)is theP></
1 2 3 |
当你打印在任何Java对象toString()则会呼叫。现在轮到你如果你重写ToString()方法,那么你会呼叫呼叫其他对象类的方法。P></
1 |
上面的函数对象primitives of different of打印阵列。P></
1 | [[AAAAA, BBBBB], [6, 12], [2003-04-01 00:00:00.0, 2003-10-01 00:00:00.0], [2003-09-30 00:00:00.0, 2004-03-31 00:00:00.0], [Interim, Interim], [2003-09-30, 2004-03-31]]; |