프로그래밍/Java

Java - Reflection

seungdols 2015. 9. 15. 15:35

java.lang.reflect의 핵심 리플렉션 기능을 이용하면, 메모리에 적재된 클래스의 정보를 가져오는 프로그램을 작성 할 수 있다. Class가 주어지면, 해당 객체가 나타내는 클래스의 생성자, 메서드, 필드등을 나타내는 Constructor, Method, Field 객체들을 가져 올수 있으며, 이 객체를 이용하여, 클래스의 멤버 이름이나, 필드 자료형, 메서드 시그니처 정보를 얻을 수 있다. 그리고, 해당 객체를 이용하여, 연결 되어 있는 생성자, 메서드, 필드들을 Reflectively 조작 할 수 있다. 


단점

- 컴파일 시점에 자료형을 검사하는 이점을 포기해야 함

- 리플렉션 기능을 이용하는 코드는 난잡하다.

- 성능이 낮다.


리플렉션이 필요한 프로그램

- 클래스 브라우저

- 객체 검사도구

- 코드 분석 도구

- 해석적 내장형 시스템

- Stub Complier가 없는 Remote Procedure Call 시스템 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class ReflectionEx {
    public static void main(String[] args) {
        Class
 cl = null;
        try{
            cl = Class.forName(args[0]);
        }catch (ClassNotFoundException e)
        {
            System.err.println("Class Not Found");
            System.exit(1);//이 메서드는 전체 VM을 종료시킨다. 조심해야한다.(cmd 유틸리티 종료시키는 데에는 적합함)
        }
 
        Set
 s = null;
        try{
            s = (Set) cl.newInstance();
        }catch (IllegalAccessException e)
        {
            System.err.println("Class not Accessible");
            System.exit(1);
        }catch (InstantiationException e)
        {
            System.err.println("Class not Instantiable");
            System.exit(1);
        }
 
        s.addAll(Arrays.asList(args).subList(1,args.length));
        System.out.println(s);
 
    }
}
cs

위 예제는 객체 생성은 리플렉션으로 생성하고, 참조와 사용은 인터페이스를 이용한다. 

즉, 고급진 스킬이다. 




위 예제는 두가지의 단점을 보여준다. 


- 세가지 실행 시점 오류를 발생 시킨다.

- 클래스의 객체를 생성하기 위해 긴 코드를 사용한다. - 생성자 호출이면 한 줄이면 끝.

객체가 만들어지고 나면 다른 Set 객체와 분간 할 수 없다. 고로, 리플렉션을 제한적으로 사용한다면, 실제 프로그램에는 아무런 영향이 없다.


단, 위의 예제는 컴파일 오류를  발생 시킨다.


위의 오류는 제거 하는 방법은 따로 있다.



  •  무단 수정 및 배포는 금지합니다. 
  •  모든 내용은 본 블로그 운영자가 정리한 내용입니다. 
  •  참조한 정보에 대해서는 출처를 남기고 있습니다.
  •  틀린 내용 / 오류가 포함된 내용은 댓글로 남겨주세요.
  •  choiseungho0822@gmail.com 보내주셔도 됩니다.
  •  Seungdols Wiki 운영중입니다.


반응형