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


구글링을 하다가 Reflection 기법이라는 것을 보았는데 제 머리로는 잘 이해가 가질 않습니다. reflection의 개념과 이해에 도움이 될만한 간단한 예제 좀 보여주실수있나요?

  • 2016년 02월 12일에 작성됨

조회수 737


1 답변


좋아요
0
싫어요
채택취소하기

리플렉션은 클래스를 조사하는데 쓰입니다. 특정 형식(리턴타입, 매개변수)의 메소드가 있는지, 필드들은 어떤걸 가지고 있는지, 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{

}


  • 2016년 02월 12일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • RetentionPolicy.RUNTIME가 무슨뜻인가요 그리고 invoke메소드가 뭐를 하는건지도 알수 있을까요?     cg   2016.2.12 18:38     
  • invoke는 해당 메소드를 실행하는 일을 합니다. parameter로 클래스의 인스턴스를 넘겨준거에요. RetentionPolicy는 Runtime에 어노테이션을 체크하라는 의미라는데 정확히는 모르겠네요. 어노테이션을 만들때는 저렇게 쓰라고 배웠습니다.    정두식   2016.2.12 19:03     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close