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에 대해서 알아보는 시간이었습니다.
공통적인 부분을 처리할 때 동적으로 처리를 할 수 있다는 점이 장점이었지만
컴파일 시점에 오류를 잡을 수 없다는 점이 아쉬웠습니다.
포스팅 봐주셔서 감사합니다.
[참고]
'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 |