programing

"SomeType@2f92e0f4"를 표시하지 않고 Java 객체를 인쇄하려면 어떻게 해야 합니까?

goodsources 2022. 9. 4. 20:18
반응형

"SomeType@2f92e0f4"를 표시하지 않고 Java 객체를 인쇄하려면 어떻게 해야 합니까?

다음과 같이 정의된 클래스가 있습니다.

public class Person {
  private String name;

  // constructor and getter/setter omitted
}

수업 예시를 인쇄하려고 했습니다.

System.out.println(myPerson);

결과가 .com.foo.Person@2f92e0f4

비슷한 일이 일어났는데, 내가 배열을 인쇄하려고 했을 때Person★★★★★★★★★★★★★★★★★★:

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

[Lcom.foo.Person;@28a418fc

이 출력은 무엇을 의미합니까?이 출력을 내 개인 이름이 포함되도록 변경하려면 어떻게 해야 합니까?오브젝트 컬렉션을 인쇄하려면 어떻게 해야 하나요?

주의: 이것은 이 주제에 대한 공식적인 Q&A를 의도한 것입니다.

배경

가 있습니다.toString()방법.

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

이 메서드는 클래스(모든 Java 객체의 슈퍼 클래스)에서 정의됩니다.이 메서드는 클래스 이름으로 구성된 상당히 못생긴 문자열을 반환합니다.@16진수 형식의 오브젝트 해시 코드와 기호를 지정합니다.이 코드는 다음과 같습니다.

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

as 등의 com.foo.MyType@2f92e0f4따라서 다음과 같이 설명할 수 있습니다.

  • com.foo.MyType즉는 - 클클 、 즉 - 、 즉 - - 。MyTypecom.foo.
  • @ - 줄을 잇다
  • 2f92e0f4이치노

어레이 클래스의 이름은 조금 다른 것 같습니다.이것은 용 자바독에 잘 설명되어 있습니다.예를 들어,[Ljava.lang.String다음과 같습니다.

  • [ 배열 - 단차원 배열[[ ★★★★★★★★★★★★★★★★★」[[[의 개요)
  • L 또는 되어 있습니다. - 클래스 또는 인터페이스가 포함되어 있습니다.
  • java.lang.String - 배열 내의 오브젝트 유형:

출력 커스터마이즈

할 때 System.out.println(myObject), 를 덮어쓸 필요가 있습니다.toString()메서드를 사용할 수 있습니다.하다

public class Person {

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

제쇄 a a a를 인쇄하면Person을 더 볼 수 있어요.com.foo.Person@12345678.

★★★★★★★★★★★★★★★에 주의해 주세요.toString()오브젝트를 문자열로 변환하는 방법 중 하나일 입니다.일반적으로 이 출력은 객체를 명확하고 간결하게 기술해야 합니다.더 좋다toString()의 리리 our our를 위하여Person츠키다

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

인쇄가 . ★★★★★★★★★★★★★★★★★,Person[name=Henry]디버깅/테스트에 매우 유용한 데이터입니다.

을 맞추거나 예를 다른 이 좋습니다.String toElegantReport() {...}.


출력 자동 생성

많은 IDE가 자동 생성에 대응하고 있습니다.toString()메서드(클래스의 필드를 기반으로 합니다.를 들어 Eclipse 및 IntelliJ 문서를 참조하십시오.

널리 사용되는 Java 라이브러리도 이 기능을 제공합니다.예를 들어 다음과 같습니다.


오브젝트 그룹 인쇄

그래서 넌 멋진걸 만들어냈구나toString()네 반을 위해서.해당 클래스가 배열 또는 컬렉션에 배치되면 어떻게 됩니까?

어레이

오브젝트 배열이 있는 경우 를 호출하여 어레이의 내용을 간단하게 표시할 수 있습니다.예를 들어, 이 어레이는Person★★★★★★★★★★★★★★★★★★:

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

// Prints: [Fred, Mike]

주의: 이것은, 라고 하는 스태틱 메서드에의 호출입니다.toString()위에서 설명한 것과 다른 어레이 클래스입니다.

다차원 배열을 사용하는 경우 를 사용하여 동일한 종류의 출력을 얻을 수 있습니다.

컬렉션

에서는 콜링에 됩니다..toString()모든 요소에서.

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

// Prints [Alice, Bob]

목록 가 좋은 .toString()상술한 바와 같이

apache는 문자열을 가져오는 함수를 제공하는 더 나은 util 클래스를 제공합니다.

ReflectionToStringBuilder.toString(object)

에는 Java가 .toString()메서드입니다.은, 그 의 오브젝트를 「」에 호출됩니다.System.out.println()className@hashcode hname 。

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

클래스의 toString 메서드를 덮어쓰고 다른 출력을 얻을 수 있습니다.이 예를 참조해 주세요.

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);
    }
}

이클립스 생성->이클립스 toString();

it이 the the the the the the the the the the보다 됩니다.toString()method를 지정하면 해당 클래스의 오브젝트가 출력됩니다.

저는 GSON을 사용하여 Java 객체를 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);
    }
}

intellij에서는 alt+inset 키를 누른 후 toString()을 선택하면 toString 메서드를 자동으로 생성할 수 있습니다.다음은 테스트클래스의 출력입니다.

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 +
            '}';
 }
}

보시는 바와 같이 클래스의 여러 속성을 연결하여 String을 생성합니다.원본의 경우 값을 인쇄하고 참조 유형의 경우 클래스 유형을 사용합니다(이 경우 Test2의 문자열 메서드에 사용).

Java의 가 .toString()Object Type @ Hash Code object 。

더 있는 '보다 낫다'를 합니다.toString()방법을 가르쳐 주세요.

public class Person {
  private String name;

  // constructor and getter/setter omitted

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

이제 '을 사용해서 '인물'을 출력해 .System.out.prtinln(personObj);클래스 이름과 해시 코드 대신 개인 이름이 인쇄됩니다.

를 인쇄하려고 가 됩니다.[Lcom.foo.Person;@28a418fc을 사용법을 사용하다


만약 당신이 그 사람의 이름을 인쇄하고 싶다면, 여러 가지 방법이 있습니다.

한 사람 한 사람을 반복하고 인쇄하는 기능을 직접 쓸 수 있습니다.

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

Arrays.toString()을 사용하여 인쇄할 수 있습니다.이게 제일 간단한 것 같아요.

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

Java 8 방식으로 인쇄할 수 있습니다(스트림 및 메서드 참조 사용).

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

다른 방법도 있을 수 있어요.이게 도움이 됐으면 좋겠다.:)

[] [개인] 오브젝트를 직접 인쇄하는 ClassName@HashCode규범에 준거합니다.

의 경우com.foo.Person@2f92e0f4가 되고 서 ★★★★★Person이며, 오브젝트가 속한 클래스입니다.2f92e0f4hashCode가 되다.

public class Person {
  private String name;

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

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

,그러면'의.Person 이름이 됩니다.

Class Test
 {
  public static void main(String... args){
    Person obj = new Person("YourName");
    System.out.println(obj.toString());
  }
}

오브젝트 클래스(Java에서는 모든 클래스의 부모 클래스)를 보면, toString() 메서드의 실장은 다음과 같습니다.

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

Java에서 오브젝트를 인쇄하면 toString()이 호출됩니다.이제 toString()을 덮어쓰면 메서드는 다른 오브젝트 클래스의 메서드 호출을 호출합니다.

'깊이'의 경우toString()JSON 기반 응답(Jackson, GSON 등): ReflectionToStringBuilder는 Apache Commons Lang 3 라이브러리에서 RecursiveToStringStyle 또는 MultilineRecursiveToStringStyle사용합니다.코드 예:

System.out.println("My object: " +
    ReflectionToStringBuilder.toString(theObject, new RecursiveToStringStyle()));

출력 예:

// RecursiveToStringStyle
Person@7f54[name=Stephen,age=29,smoker=false,job=Job@43cd2[title=Manager]]

// MultilineRecursiveToStringStyle
Person@7f54[
  name=Stephen,
  age=29,
  smoker=false,
  job=Job@43cd2[
    title=Manager
  ]
]

5년 봄에 잭슨을 이용해서 이 일을 해냈어요.개체에 따라서는 일부 경우에 작동하지 않을 수 있습니다.

import com.fasterxml.jackson.databind.ObjectMapper;
    
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(yourObject));

출력은 다음과 같습니다.

{
  "id" : 1,
  "fieldOne" : "string"
}

여기 잭슨을 사용한 더 많은 예가 있습니다.

GSON을 쓰면 이렇게 보일 수 있어요.

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

클래스에서 Lombok @Data 주석을 사용하면 getter, setter, toString 및 해시 코드가 제공됩니다.Lombok을 사용하면 보일러 코드를 처리할 수 있기 때문에 더 좋습니다.

프로젝트 Lombok을 사용하는 경우@ToString인 '어느 정도'를 생성합니다.toString()★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

import lombok.ToString;

@ToString
public class LoginDto {
  private String user;
  private String pass;
}
...
System.out.println(loginDto.toString());
// LoginDto(user=x@xxx.x, pass=xxxxx)

언급URL : https://stackoverflow.com/questions/29140402/how-do-i-print-my-java-object-without-getting-sometype2f92e0f4

반응형