자바에서 리플렉션(Reflection)이 뭔가요?
조회수 4991회
구글링을 하다가 Reflection 기법이라는 것을 보았는데 제 머리로는 잘 이해가 가질 않습니다. reflection의 개념과 이해에 도움이 될만한 간단한 예제 좀 보여주실수있나요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
리플렉션은 클래스를 조사하는데 쓰입니다. 특정 형식(리턴타입, 매개변수)의 메소드가 있는지, 필드들은 어떤걸 가지고 있는지, private인지 public인지를 얻어올 수 있습니다.
저는 특정 메소드가 내가 정한 어노테이션을 쓰는지 볼 때 리플렉션을 써 봤는데요. 다음 코드와 같이 @RunTwice라는 리플렉션을 만들고 그 리플렉션을 가진 메소드만 골라서 2번씩 실행시켜줄 수 있어요. @RunTwice를 method1~3사이에 아무거나 붙여주고 실행해 보세요.
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.*; class Solution { public static void main(String[] args) { Solution solution = new Solution(); //Solution클래스의 모든 메소드를 읽어와서 조사하기 Method[] methods = solution.getClass().getDeclaredMethods(); for(Method method : methods){ if(method.isAnnotationPresent(RunTwice.class)){ try{ //이름대로 2번 실행해주기. method.invoke(solution); method.invoke(solution); } catch(Exception e){ e.printStackTrace(); } } } } @RunTwice public void method1(){ System.out.println("메소드 1 입니다."); } public void method2(){ System.out.println("메소드 2 입니다."); } public void method3(){ System.out.println("메소드 3 입니다."); } } //RunTwice라는 어노테이션을 만들기 @Retention(RetentionPolicy.RUNTIME) @interface RunTwice{ }
- RetentionPolicy.RUNTIME가 무슨뜻인가요 그리고 invoke메소드가 뭐를 하는건지도 알수 있을까요? 알 수 없는 사용자 2016.2.12 18:38
- invoke는 해당 메소드를 실행하는 일을 합니다. parameter로 클래스의 인스턴스를 넘겨준거에요. RetentionPolicy는 Runtime에 어노테이션을 체크하라는 의미라는데 정확히는 모르겠네요. 어노테이션을 만들때는 저렇게 쓰라고 배웠습니다. 정토드 2016.2.12 19:03
댓글 입력