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 Person
objetos:
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.
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 Object
clase (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á MyType
en el paquete com.foo
.@
- une la cuerda2f92e0f4
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.String
significa:
[
- una matriz unidimensional (a diferencia de [[
o [[[
etc.)L
- la matriz contiene una clase o interfazjava.lang.String
- el tipo de objetos en la matrizPara 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 Person
clase 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() {...}
.
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:
@ToString
anotación del Proyecto Lombok
Así que has creado un bonito toString()
para tu clase. ¿Qué sucede si esa clase se coloca en una matriz o una colección?
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 Person
objetos:
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.
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.
Creo que apache proporciona una mejor clase de utilidad que proporciona una función para obtener la cadena
ReflectionToStringBuilder.toString(object)
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);
}
}
En Eclipse, vaya a su clase, haga clic derecho-> fuente-> Generar toString()
;
Anulará el toString()
método e imprimirá el objeto de esa clase.
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);
}
}
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).
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;@28a418fc
el 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. :)
Si imprime directamente cualquier objeto de Persona, lo hará [email protected]
al Código.
en su caso [email protected]
se está imprimiendo. Donde Person
es una clase a la que pertenece el objeto y 2f92e0f4
es 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());
}
}
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.
Logré hacer esto usando Jackson
Spring 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 GSON
también. Debería ser algo como esto:
Gson gson = new Gson();
System.out.println(gson.toJson(objectYouWantToPrint).toString());
La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.
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.
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.
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 inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.
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?
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!
¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?
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.
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.
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.
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.
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.
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
El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.
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".
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.
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.
Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.