자바에서 리플렉션(Reflection)이 뭔가요?

조회수 4980회

구글링을 하다가 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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)