Reflection & Dynamic Proxy

ymk·2023년 6월 13일
0
post-thumbnail

📖 Reflection

JVM이 클래스로더를 통해 클래스 정보를 읽어오고 해당 정보를 JVM 메모리에 저장한다. 이러한 클래스에 대한 정보를 리플렉션(Reflection)이라고 한다. 리플렉션을 이용하여 클래스에 대한 정보를 자세히 알 수 있다.

Class<User> uClass = User.class;
Class<User> uClass = "객체".class();
Class<?> uClass = Class.forName("com.devcourse.User");

이외에도 .getDeclaredContructor(), .newInstance(), getDeclaredMethod()등을 사용하여 생성자, 메소드, 필드에 대한 정보도 알아낼 수 있다.

리플렉션은 런타임에 클래스를 분석하기 때문에 속도가 느리고 객체의 추상화가 깨진다는 단점이 존재한다. 그렇기 때문에 일반적으로 웹 개발자는 리프렉션을 사용할 일은 거의 없다고 한다.


💡 Dynamic Proxy

Proxy란?

자바에서 Proxy는 Reflection과 연결된다. RealSubject 자신의 기능에만 집중을 하고 그 외의 부가 기능을 제공하거나 접근을 제어하는 역할을 Proxy객체에게 위임한다.

즉 Client가 의존하는 Subject는 인터페이스이며 Proxy와 RealSubject가 구현한다. 이것을 Proxy 패턴이라고 한다. 이렇게 함으로써 RealSubject에 말고 Proxy에 접근 제어나 부가 기능들을 추가하여 SRP원칙을 지킬 수 있게 된다.

하지만 Proxy 객체를 직접 생성하는 일은 많은 불편함을 가져다 줄 수 있다. 즉 타겟이 여럿이고 대부분 동일한 기능을 제공해야하는 Proxy를 정의해야하면 중복되는 코드가 많아질 것이다. Dynamic Proxy를 이용하여 이러한 단점을 개선한다.

Dynamic Proxy

Dynamic Proxy는 Proxy 객체를 직접 생성하지 않고 Runtime에 Interface를 구현하는 Class나 Instance를 만들어내는 것이다.

java.lang.reflect.Proxy 패키지에서 제공하는 API를 사용하여 Dynmaic Proxy를 이용할 수 있다.

java.lang.reflect.Proxy

public static Object newProxyInstance(
    ClassLoader loader,
    Class<?>[] interfaces,
    InvocationHandler h
) throws IllegalArgumentException

Ex)

Hello hello = (Hello) Proxy.newProxtInstance (
	Main.class.getClassLoader(),
    new Class[] {Hello.class},
    new UpperCaseHander(new HelloTarget())
)

Reference

https://hudi.blog/java-reflection/

https://velog.io/@dev_leewoooo/Proxy-pattern%EC%9D%B4%EB%9E%80-with-Java

profile
개발 공부 일지

0개의 댓글