자바 Reflection 어노테이션 기반 DI 구현

Kyu·2022년 8월 10일
0

Java 공부기록

목록 보기
37/40
package di;

import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

public class ContainerService {

    // Method paramter로 넘기는 타입으로 리턴타입을 받는다.
    public static <T> T getObject(Class<T> classType){
        T instance = createInstance(classType);
        Arrays.stream(classType.getDeclaredFields()).forEach(f -> {
            // 만약에 필드에 Inject 어노테이션이 붙어있다면
            if (f.getAnnotation(Inject.class) != null) {
                // 해당 Inject가 붙은 클래스의 타입을 가져와서
                Class<?> type = f.getType();
                // 해당퇴는 타입의 인스턴스를 만든다
                Object filedInstance = createInstance(type);
                f.setAccessible(true);
                try {
                    System.out.println(f.get(instance));
                    f.set(instance, filedInstance );
                    System.out.println(f.get(instance));
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        return instance;
    }

    // 리플렉션을 통해 instance를 생성하는 메소드
    private static <T> T createInstance(Class<T> classType) {
        try {
            return classType.getDeclaredConstructor().newInstance();
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
}
profile
TIL 남기는 공간입니다

0개의 댓글