"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 라이브러리도 이 기능을 제공합니다.예를 들어 다음과 같습니다.
MoreObjects.ToStringHelperGoogle Guava에서
오브젝트 그룹 인쇄
그래서 넌 멋진걸 만들어냈구나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
'programing' 카테고리의 다른 글
| cacerts와 keystore의 차이점은 무엇입니까? (0) | 2022.09.04 |
|---|---|
| 가장 효율적인 Java Collections 라이브러리는 무엇입니까? (0) | 2022.09.04 |
| Java의 UUID.randomUUID는 어느 정도 우수합니까? (0) | 2022.09.04 |
| Spring Boot 2.5.0은 plain.jar 파일을 생성합니다.제거할 수 있나요? (0) | 2022.09.04 |
| Python에서 "named tuples"는 무엇입니까? (0) | 2022.09.04 |