본문 바로가기
(2024-10) 스파르타 내일배움캠프 - 백엔드/Java Reflect

Java Reflect의 Array 제어

by 어뫄어뫄 2024. 11. 27.
import java.util.Arrays;
import java.util.List;

public class ReflectionExample {

    public static void main(String[] args) {
        String[] stringArray = {"Hello", "World", "Java"};
        List<Integer> intList = Arrays.asList(1, 2, 3, 4);

        analyzeArray(stringArray);
        analyzeArray(intList);
    }

    public static void analyzeArray(Object arrayObject) {
        Class<?> clazz = arrayObject.getClass();

        // 배열 여부 확인
        System.out.println(String.format("Is array: %s", clazz.isArray()));

        // 배열의 타입 정보 출력
        Class<?> elementType = clazz.getComponentType();
        if (elementType == null) {
            elementType = List.class; // List는 배열이 아님
            System.out.println("This is a List of type: " + intList.getClass().getGenericSuperclass());
        } else {
            System.out.println(String.format("This is an array of type: %s", elementType.getTypeName()));
        }

        // 배열 또는 리스트의 값 출력
        printArrayValues(arrayObject);
    }

    public static void printArrayValues(Object arrayObject) {
        int length;

        if (arrayObject instanceof List<?>) {
            length = ((List<?>) arrayObject).size();
            System.out.print("List values: [");
            List<?> list = (List<?>) arrayObject;
            for (int i = 0; i < length; i++) {
                System.out.print(list.get(i));
                if (i != length - 1) {
                    System.out.print(", ");
                }
            }
        } else {
            length = java.lang.reflect.Array.getLength(arrayObject);
            System.out.print("Array values: [");
            for (int i = 0; i < length; i++) {
                Object element = java.lang.reflect.Array.get(arrayObject, i);
                System.out.print(element);
                if (i != length - 1) {
                    System.out.print(", ");
                }
            }
        }
        System.out.print("]");
        System.out.println();
    }
}

 

1. getClass()

  • 설명: 객체의 런타임 클래스 정보를 가져옵니다. 이 메서드는 Object 클래스에서 상속되며, 모든 Java 객체에서 사용할 수 있습니다.
  • 용법: Class<?> clazz = arrayObject.getClass();

2. isArray()

  • 설명: 해당 클래스가 배열인지 여부를 확인합니다. 배열 클래스에서 호출할 수 있으며, 배열인 경우 true, 그렇지 않으면 false를 반환합니다.
  • 용법: clazz.isArray()

3. getComponentType()

  • 설명: 배열의 컴포넌트(요소) 타입을 반환합니다. 이 메서드는 배열 클래스에서만 사용할 수 있으며, 배열의 타입 정보가 필요할 때 사용됩니다.
  • 용법: Class<?> elementType = clazz.getComponentType();

4. getGenericSuperclass()

  • 설명: 클래스의 제네릭 슈퍼클래스를 반환합니다. 이 메서드는 주로 제네릭 타입을 다룰 때 사용됩니다.
  • 용법: intList.getClass().getGenericSuperclass(); (리스트의 경우)

5. Array.getLength(Object array)

  • 설명: 주어진 배열의 길이를 반환합니다. 이 메서드는 java.lang.reflect.Array 클래스의 정적 메서드입니다.
  • 용법: int length = java.lang.reflect.Array.getLength(arrayObject);

6. Array.get(Object array, int index)

  • 설명: 주어진 배열에서 특정 인덱스의 요소를 가져옵니다. 이 메서드는 java.lang.reflect.Array 클래스의 정적 메서드입니다.
  • 용법: Object element = java.lang.reflect.Array.get(arrayObject, i);