"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
즉는 - 클클 、 즉 - 、 즉 - - 。MyType
com.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.ToStringHelper
Google 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
이며, 오브젝트가 속한 클래스입니다.2f92e0f4
hashCode가 되다.
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 |