규칙 53. 리플렉션 대신 인터페이스를 이용하라

기능

  • 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있다.

  • java.lang.reflect의 핵심 리플렉션 기능을 이용하면 메모리에 적재된 클래스의 정보를 가져오는 프로그램을 작성 할 수 있다.

  • Class 객체가 주어지면 해당 객체의 생성자, 메서드, 필드를 나타내는 Constructor, Method, Filed 객체를 가져올 수 있다.

    • 클래스의 멤버 이름, 필드 자료형, 메서드 시그니처등의 정보를 얻을 수 있음
    • 실제 생성자, 메서드, 필드를 반영적(reflectively)로 조작 가능, 객체 생성, 메서드 호출, 필드 접근 가능
    • 객체에 정의된 어떤 메서드도 호출 가능, 컴파일 시 존재하지 않는 클래스 이용 가능
public static void main(String[] args) {
 // 클래스이름을 Class 객체로변환
 Class<?> cl = null;

 try {
  cl = Class.forName(args[0]);
 } catch(ClassNotFoundException e) {
  System.err.println("Class not found.");
  System.exit(1);
 }

 // 해당 클래스의 객체 생성
 Set<String> s = null;

 try {
  s = (Set<String>) 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);
 }

 // Set 이용
 s.addAll(Arrays.asList(args).subList(1, args.length));
 System.out.println(s);
}
  • 프로그램의 첫번째 인자의 이름의 클래스를 이용해 Set<String>객체를 만들고 나머지 인자를 집합에 넣고 출력
  • 리플렉션의 단점
    • 세가지 실행시점 오류 발생, 리플렉션이 아니라면 컴파일 시점에 검사할 수 있음
    • 클래스 객체 생성하기 위해 쓸데없는 코드 사용
  • 리플렉션을 제한적 이용시 실제 프로그램 대부분에는 영향이 없다

적절한사용법

  • 핵심 리플렉션 기능은 컴포넌트 기반 응용프로그램 제작 도구를 위해 설계
  • 리플렉션이 필요한 프로그램
    • 클래스 브라우저, 객체 검사도구, 코드 분석도구, 해석적 내장형 시스템, 스텁 컴파일러가 없는 원격 프로시저 호출
  • 일반적인프로그램은 프로그램 실행 중에 리플렉션을 통해 객체를 이용하려하면 안됨
  • 리플렉션을 아주 제한적으로만 사용하면 오버헤드를 피하면서도 리플렉션의 다양한 장점을 누릴 수 있다
  • 객체 생성은 리플렉션으로 하고 객체 참조는 인터페이스나 상위 클래스를 통하면 된다

results matching ""

    No results matching ""