개발/Java
Reflection과 객체 생성
jis1218
2024. 12. 2. 21:59
Reflection을 사용하는 라이브러리가 정말 많다.
Jackson, Mockito, JDK 동적 프록시, JPA 등등
보면 어떤 라이브러리를 사용하기 위해서는 기본 생성자가 필요하고 어떤 것은 또 그렇지 않다. 예를 들면 JPA나 Jackson의 경우 기본 생성자가 필요하다.(Jackson의 경우 안그런 경우도 보긴 봤다.) 하지만 JDK 동적 프록시는 직접 코드를 짜서 해보니 필요하지 않더라. 왜 그럴까?
JDK 동적 프록시의 경우는 인터페이스를 기반으로 프록시를 생성하고 객체 생성이 아닌 메서드 호출 처리에 초점이 맞춰져 있기 때문에 기본 생성자가 필요 없다.
Jackson의 경우 Json을 객체로 역직렬화 할 때 리플렉션을 사용하여 객체를 생성한다. 직접 테스트를 해보니 Jackson 라이브러리에서 파라미터가 있는 생성자만 있어도 객체 생성을 해주고 있다. deserializeFromObjectUsingNonDefault라는 메서드가 있는데 이름에서 알 수 있듯이 Default 생성자가 아님에도 deserialize를 해주고 있음을 알 수 있다. 이 메서드를 타고타고 가면 java.lang.relfect에 Constructor라는 클래스가 있고 아래와 같이 newInstance를 파라미터와 함께 생성하고 있다.
@CallerSensitive
@ForceInline // to ensure Reflection.getCallerClass optimization
public T newInstance(Object ... initargs)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
Class<?> caller = override ? null : Reflection.getCallerClass();
return newInstanceWithCaller(initargs, !override, caller);
}
반면 getter가 없으니 값이 들어가지 않는다. Reflection으로 객체 생성 후에 getter를 이용하여 값을 넣어주는데 getter가 없으니 기본값이 들어간다.(int는 0, String은 null)