¿Cómo imprimo mi objeto Java sin obtener “SomeType @ 2f92e0f4”?

319
Duncan Jones 2015-03-19 22:59.

Tengo una clase definida de la siguiente manera:

public class Person {
  private String name;

  // constructor and getter/setter omitted
}

Intenté imprimir una instancia de mi clase:

System.out.println(myPerson);

pero me dio el siguiente resultado: [email protected].

Algo similar sucedió cuando intenté imprimir una matriz de Personobjetos:

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

Tengo la salida: [Lcom.foo.Person;@28a418fc

¿Qué significa esta salida? ¿Cómo cambio esta salida para que contenga el nombre de mi persona? ¿Y cómo imprimo colecciones de mis objetos?

Nota : se trata de una sesión de preguntas y respuestas canónicas sobre este tema.

10 answers

422
Duncan Jones 2015-03-19 22:59.

Antecedentes

Todos los objetos Java tienen un toString()método, que se invoca cuando intenta imprimir el objeto.

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

Este método se define en la Objectclase (la superclase de todos los objetos Java). El Object.toString()método devuelve una cadena de aspecto bastante feo, compuesta por el nombre de la clase, un @símbolo y el código hash del objeto en hexadecimal. El código para esto se ve así:

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

Un resultado como, [email protected]por tanto, se puede explicar como:

  • com.foo.MyType - el nombre de la clase, es decir, la clase está MyTypeen el paquete com.foo.
  • @ - une la cuerda
  • 2f92e0f4 el código hash del objeto.

El nombre de las clases de matriz se ve un poco diferente, lo que se explica bien en los Javadocs para Class.getName(). Por ejemplo, [Ljava.lang.Stringsignifica:

  • [- una matriz unidimensional (a diferencia de [[o [[[etc.)
  • L - la matriz contiene una clase o interfaz
  • java.lang.String - el tipo de objetos en la matriz

Personalización de la salida

Para imprimir algo diferente cuando llama System.out.println(myObject), debe anular el toString()método en su propia clase. He aquí un ejemplo sencillo:

public class Person {

  private String name;
  
  // constructors and other methods omitted
  
  @Override
  public String toString() {
    return name;
  }
}

Ahora, si imprimimos un Person, vemos su nombre en lugar de [email protected].

Tenga en cuenta que toString()es solo una forma de convertir un objeto en una cadena. Por lo general, esta salida debe describir completamente su objeto de una manera clara y concisa. Un mejor toString()para nuestra Personclase podría ser:

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

Que imprimir, por ejemplo, Person[name=Henry]. Esa es una pieza de datos realmente útil para depurar / probar.

Si desea enfocarse en un solo aspecto de su objeto o incluir mucho formato de jazz, podría ser mejor definir un método separado en su lugar, por ejemplo String toElegantReport() {...}.


Autogenerar la salida

Muchos IDE ofrecen soporte para la generación automática de un toString()método, según los campos de la clase. Consulte los documentos de Eclipse e IntelliJ , por ejemplo.

Varias bibliotecas populares de Java también ofrecen esta función. Algunos ejemplos incluyen:


Imprimir grupos de objetos

Así que has creado un bonito toString()para tu clase. ¿Qué sucede si esa clase se coloca en una matriz o una colección?

Matrices

Si tiene una matriz de objetos, puede llamar Arrays.toString()para producir una representación simple del contenido de la matriz. Por ejemplo, considere esta matriz de Personobjetos:

Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));

// Prints: [Fred, Mike]

Nota: esta es una llamada a un método estático llamado toString()en la clase Arrays, que es diferente a lo que hemos estado discutiendo anteriormente.

Si tiene una matriz multidimensional , puede usarla Arrays.deepToString()para lograr el mismo tipo de salida.

Colecciones

La mayoría de las colecciones producirán una salida bonita basada en llamar .toString()a cada elemento.

List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));    
System.out.println(people);

// Prints [Alice, Bob]

Por lo tanto, solo debe asegurarse de que los elementos de su lista definan un bonito toString()como se discutió anteriormente.

61
Rohith K 2015-04-16 03:31.

Creo que apache proporciona una mejor clase de utilidad que proporciona una función para obtener la cadena

ReflectionToStringBuilder.toString(object)
37
Pankaj Manali 2015-03-20 00:04.

Cada clase en Java tiene el toString()método de forma predeterminada, que se llama si le pasa algún objeto de esa clase System.out.println(). De forma predeterminada, esta llamada devuelve el className @ hashcode de ese objeto.

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

Puede anular el método toString de una clase para obtener una salida diferente. Ver este ejemplo

class A {
    String s = "I am just a object";
    @Override
    public String toString()
    {
        return s;
    }
}

class B {
    public static void main(String args[])
    {
        A obj = new A();
        System.out.println(obj);
    }
}
16
ketankk 2016-04-22 03:45.

En Eclipse, vaya a su clase, haga clic derecho-> fuente-> Generar toString();

Anulará el toString()método e imprimirá el objeto de esa clase.

12
Agam 2018-10-10 02:18.

Prefiero usar una función de utilidad que usa GSON para deserializar el objeto Java en una cadena JSON.

/**
 * 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);
    }
}
6
Mr.Q 2016-07-28 20:00.

En intellij, puede generar automáticamente el método toString presionando alt + inset y luego seleccionando toString () aquí hay una salida para una clase de prueba:

public class test  {
int a;
char b;
String c;
Test2 test2;

@Override
public String toString() {
    return "test{" +
            "a=" + a +
            ", b=" + b +
            ", c='" + c + '\'' +
            ", test2=" + test2 +
            '}';
 }
}

Como puede ver, genera un String concatenando, varios atributos de la clase, para primitivas imprimirá sus valores y para tipos de referencia usará su tipo de clase (en este caso al método string de Test2).

6
adn.911 2017-12-03 06:23.

De forma predeterminada, cada objeto en Java tiene el toString()método que genera el ObjectType @ HashCode.

Si desea información más significativa, debe anular el toString()método en su clase.

public class Person {
  private String name;

  // constructor and getter/setter omitted

  // overridding toString() to print name
  public String toString(){
     return name;  
  }
}

Ahora, cuando imprima el objeto persona que lo usa System.out.prtinln(personObj);, imprimirá el nombre de la persona en lugar del nombre de la clase y el código hash.

En su segundo caso, cuando intenta imprimir la matriz, imprime [Lcom.foo.Person;@28a418fcel tipo de matriz y su código hash.


Si desea imprimir los nombres de las personas, hay muchas formas.

Podría escribir su propia función que itera a cada persona e imprime

void printPersonArray(Person[] persons){
    for(Person person: persons){
        System.out.println(person);
    }
}

Puede imprimirlo usando Arrays.toString (). Esto me parece el más simple.

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

Puede imprimirlo de la forma Java 8 (utilizando secuencias y referencia de método).

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

También puede haber otras formas. Espero que esto ayude. :)

4
Vikrant Kashyap 2016-05-07 01:22.

Si imprime directamente cualquier objeto de Persona, lo hará [email protected]al Código.

en su caso [email protected]se está imprimiendo. Donde Persones una clase a la que pertenece el objeto y 2f92e0f4es el código hash del objeto.

public class Person {
  private String name;

  public Person(String name){
  this.name = name;
  }
  // getter/setter omitted

   @override
   public String toString(){
        return name;
   }
}

Ahora, si intentas usar el objeto de Person, se imprimirá el nombre

Class Test
 {
  public static void main(String... args){
    Person obj = new Person("YourName");
    System.out.println(obj.toString());
  }
}
3
Yasir Shabbir Choudhary 2017-03-27 20:21.

Si observa la clase Object (clase principal de todas las clases en Java), la implementación del método toString () es

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

siempre que imprima cualquier objeto en Java, se llamará a toString (). Ahora depende de usted si anula toString (), entonces su método llamará a otra llamada al método de la clase Object.

0
user9869932 2020-11-06 07:34.

Logré hacer esto usando JacksonSpring 5. Dependiendo del objeto, Jackson podría no funcionar en todos los casos.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

ObjectMapper mapper = new ObjectMapper();
Staff staff = createStaff();
// pretty print
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff);
System.out.println("-------------------------------------------------------------------")
System.out.println(json);
System.out.println("-------------------------------------------------------------------")

la salida sería algo como

-------------------------------------------------------------------
{
  "id" : 1,
  "internalStaffId" : "1",
  "staffCms" : 1,
  "createdAt" : "1",
  "updatedAt" : "1",
  "staffTypeChange" : null,
  "staffOccupationStatus" : null,
  "staffNote" : null
}
-------------------------------------------------------------------

Más ejemplos usando Jackson aquí

Puedes probar GSONtambién. Debería ser algo como esto:

Gson gson = new Gson();
System.out.println(gson.toJson(objectYouWantToPrint).toString());

Related questions

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Mire a este policía escalar una situación sin otra razón que ser un idiota

Mire a este policía escalar una situación sin otra razón que ser un idiota

Captura de pantalla del video de Facebook Para aquellos de ustedes que pueden ser demasiado jóvenes para saber esto, antes de que Ice-T fuera una gran estrella en Ley y orden: Unidad de víctimas especiales, era uno de los mejores raperos gangsta de Los Ángeles de todos los tiempos. De hecho, estaba haciendo gangsta rap antes que N.

Reemplace 'Cargado racialmente' por 'Racista' con esta extensión de Chrome

Reemplace 'Cargado racialmente' por 'Racista' con esta extensión de Chrome

Imagen a través de WHAS 11 Algunas cosas realmente podrían tener "carga racial" sin ser racistas. Pero en los principales medios de comunicación, el primero suele ser un código para el segundo.

Proud Mary de Taraji P. Henson es una gran protagonista en busca de una buena película

Proud Mary de Taraji P. Henson es una gran protagonista en busca de una buena película

Foto: Sony Taraji P. Henson, experta tanto en reacciones cáusticas como en expresiones con los ojos húmedos de abrumador conflicto interno, es una actriz dinámica.

Gregg Popovich: LaMarcus Aldridge pidió ser intercambiado este verano, pero ahora estamos bien

Gregg Popovich: LaMarcus Aldridge pidió ser intercambiado este verano, pero ahora estamos bien

Foto: Ronald Martinez / Getty El grandote de los Spurs, LaMarcus Aldridge está teniendo quizás la temporada más eficiente de su carrera mientras reemplaza a Kawhi Leonard como el jugador principal de San Antonio. Mientras que los Warriors y los Rockets están en una carrera armamentista para ver quién puede disparar 100 triples en un juego primero, los Spurs están escondidos detrás de Houston.

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.

India me está pateando el culo

India me está pateando el culo

Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Language