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 객체와 분간 할 수 없다. 고로, 리플렉션을 제한적으로 사용한다면, 실제 프로그램에는 아무런 영향이 없다.
단, 위의 예제는 컴파일 오류를 발생 시킨다.
위의 오류는 제거 하는 방법은 따로 있다.
|
반응형
'프로그래밍 > Java' 카테고리의 다른 글
Stream 관련 - 예전 방식 vs Stream (0) | 2015.09.18 |
---|---|
Java - EnumMap에 대한 간단한 사용 (0) | 2015.09.15 |
Java - 객체 참조시 자료형을 인터페이스를 선호하라. (0) | 2015.09.15 |
Java - String (0) | 2015.09.15 |
Java - 오버로딩시 주의사항 (0) | 2015.09.15 |