본문 바로가기
Java

[Java] toString() 공통 오버라이드

by 루에 2024. 6. 5.
반응형

라이브러리를 안써서 직접 구현

 

package com.gsr.base;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class CmmUtils {
	/**
	 * 배열을 입력받아 리스트로 리턴한다.
	 *
	 * @param s 동적 배열
	 */
	@SafeVarargs
	public static <T> List<T> listOf(T... s) {
		if(s == null) {
			return new ArrayList<>();
		}
		return Arrays.stream(s).collect(Collectors.toList());
	}
	/**
	 * 배열을 입력받아 배열리스트로 리턴한다.
	 *
	 * @param s 동적 배열
	 */
	@SafeVarargs
	public static <T> ArrayList<T> arrayListOf(T... s) {
		if(s == null) {
			return new ArrayList<>();
		}
		return Arrays.stream(s).collect(Collectors.toCollection(ArrayList::new));
	}

	/**
	 * obj의 이름과 파라미터를 문자열로 변환하여 리턴한다.
	 * 객체명 [파라미터명=값, 파라미터명=값]
	 *
	 * @param obj 객체
	 * @return 문자열로 변환된 정보
	 */
	public static String getClassParams(Object obj) {
		return getClassParams(obj, null);
	}


	/**
	 * obj의 이름과 파라미터를 문자열로 변환하여 리턴한다.
	 * 출력 제외하고자 하는 파라미터가 있을 경우 사용한다.
	 * 객체명 [파라미터명=값, 파라미터명=값]
	 *
	 * @param obj 객체
	 * @param ignores 출력 제외 파라미터명 리스트
	 * @return 문자열로 변환된 정보
	 */
	public static String getClassParams(Object obj, List<Object> ignores) {
		Class<?> clazz = obj.getClass();
		StringBuilder stringBuilder = new StringBuilder();
		try {
			// prefix 붙임
			stringBuilder.append(clazz.getSimpleName()).append(" [");
			Field[] fieldDatas;
			if(clazz.getSuperclass() != null) {
				List<Field> list1 = listOf(clazz.getSuperclass().getDeclaredFields());
				List<Field> list2 = listOf(clazz.getDeclaredFields());
				list1.addAll(list2);
				fieldDatas = list1.toArray(new Field[0]);
			} else {
				fieldDatas = listOf(clazz.getDeclaredFields()).toArray(new Field[0]);
			}
			// print 하지 않을 파라미터는 제외하고 리스트업
			Field[] fields = ignores != null
					// ? Arrays.stream(clazz.getDeclaredFields())
					? Arrays.stream(fieldDatas)
					.filter(v -> {
						try {
							return !ignores.contains(v.get(obj));
						} catch (IllegalAccessException e) {
							return false;
						}
					}).toArray(Field[]::new)
					: fieldDatas;
			// 파라미터 내용 기록
			for (Field field : fields) {
				field.setAccessible(true);
				Object o = field.get(obj);
				stringBuilder.append(field.getName()).append("=").append(field.get(obj))
						.append(", ");
			}
			// 마지막 ', ' 지움
			stringBuilder.delete(stringBuilder.length() - 2, stringBuilder.length());
			// suffix 붙임
			stringBuilder.append("]");
			return stringBuilder.toString();
		} catch (IllegalAccessException iae) {
			// 에러 발생 시, 만들어진 것까지만 갈무리하고 에러 발생 메세지 추가하여 리턴
			stringBuilder.append("]");
			stringBuilder.append(" ").append(iae.getMessage());
			return stringBuilder.toString();
		}
	}

}
반응형

댓글