JAVA

[Java] Reflection

lakelight 2022. 8. 24. 09:42
728x90
반응형

이미지 출처: https://www.worldofitech.com/java-programming-reflection/

 

Java Reflection

클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체생성하거나 변수변경할 수 있습니다. 또한 메소드를 호출할 수도 있습니다. Reflection은 자바에서 기본적으로 제공하는 API이고, 사용방법만 알면 라이브러리 추가 없이 사용할 수 있습니다.

 

Java Reflection 사용

Reflection 예제에서 사용할 클래스
@Slf4j
public class ReflectionEX {
    @Slf4j
    static class MethodCall{
        public String MethodOne(){
            log.info("method One Call");
            return "One";
        }

        public String MethodTwo(){
            log.info("method Two Call");
            return "Two";
        }
    }
}

 

Reflection 적용 전
@Slf4j
public class ReflectionEX {

    @Test
    void reflection(){
        MethodCall target = new MethodCall();

        //메서드 One 시작
        log.info("Common Start");
        String OneValue = target.MethodOne(); //호출 대상만 다르고 모든 코드 중복
        log.info("Value={}", OneValue);
        //메서드 One 종료

        //메서드 Two 시작
        log.info("Common Start");
        String TwoValue = target.MethodTwo(); //호출 대상만 다르고 모든 코드 중복
        log.info("Value={}", TwoValue);
        //메서드 Two 종료

        /**
         * 위와 예제와 같이 호출 대상만 다르고 다른 코드가
         * 같은 경우 동적으로 처리할 필요가 있습니다.
         * 이 때 사용할 수 있는 기술이 리플렉션입니다.
         */
    }
    
}

 

Reflection 적용 후
package hello.proxy.jdkdynamic;

@Slf4j
public class ReflectionEX {

    @Slf4j
    static class MethodCall{
        public String MethodOne(){
            log.info("method One Call");
            return "One";
        }

        public String MethodTwo(){
            log.info("method Two Call");
            return "Two";
        }
    }

    @Test
    void reflection() throws Exception {
        //클래스 정보// 내부 클래스 구분을 위해 $사용
        Class methodCall = Class.forName("hello.proxy.jdkdynamic.ReflectionEX$MethodCall"); 

        MethodCall target = new MethodCall();

        Method methodCallOne = methodCall.getMethod("MethodOne"); //문자로 메서드 가져오기 (동적 처리 가능)
        dynamicCall(methodCallOne, target);

        Method methodCallTwo = methodCall.getMethod("MethodTwo"); //문자로 메서드 가져오기 (동적 처리 가능)
        dynamicCall(methodCallTwo, target);
    }

    private void commonCall(Method method, Object target) throws Exception {
        log.info("Common Start");
        Object value = method.invoke(target);
        log.info("Value={}", value);
    }
}
commonCall에서 method와 targer을 받아서 공통적인 부분의 처리를 했습니다.

 

출력 결과

09:34:36.771 [main] INFO hello.proxy.jdkdynamic.ReflectionEX - Common Start
09:34:36.774 [main] INFO hello.proxy.jdkdynamic.ReflectionEX$MethodCall - method One Call
09:34:36.774 [main] INFO hello.proxy.jdkdynamic.ReflectionEX - Value=One

09:34:36.776 [main] INFO hello.proxy.jdkdynamic.ReflectionEX - Common Start
09:34:36.776 [main] INFO hello.proxy.jdkdynamic.ReflectionEX$MethodCall - method Two Call
09:34:36.776 [main] INFO hello.proxy.jdkdynamic.ReflectionEX - Value=Two

 

Java Reflection 사용시 주의할 점

Reflection을 사용하면 클래스와 메서드의 메타정보를 사용해서 애플리케이션을 동적으로 유연하게 만들 수 있지만 Reflection은 런타임에 동작하기 때문에 컴파일 시점에 오류를 잡을 수 없기 때문에 매우 일반적인 공통 처리가 필요할 때만 부분적으로 주의하여 사용해야 합니다

 

결론

자바 기본 라이브러리인 Reflection에 대해서 알아보는 시간이었습니다.
공통적인 부분을 처리할 때 동적으로 처리를 할 수 있다는 점이 장점이었지만
컴파일 시점에 오류를 잡을 수 없다는 점이 아쉬웠습니다.

포스팅 봐주셔서 감사합니다.

 

[참고]

1. Java - Reflection [codechacha.com]

728x90
반응형

'JAVA' 카테고리의 다른 글

[Java] Collection - List  (0) 2022.09.19
[Java] JDK 동적 프록시  (0) 2022.08.24
[Java] Facade Pattern  (0) 2022.08.01
[Java] Observer Pattern  (0) 2022.08.01
[Java] Decorator Pattern - Example Car  (0) 2022.08.01