Java Reflection 기본

  • 모듈화 --> 개발의 조립화

Class 클래스

  • java.lang.Class<T>
  • 클래스(혹은 형식)에 대한 메타 데이터(이름, 생성자, 필드, 메서드)를 나타내는 객체
    • 클래스 혹은 형식의 구조 및 정의에 대한 정보 가짐
    • 리플렉션 API를 통해 접근하고 동적 조작
  • JVM에서 실행 되는 모든 클래스, 인터페이스, 열거형, 배열, 기본형 등에 대해 Class 객체(Class literal) 존재
    • Class<MyTest> testClass = MyClass.class
    • Class<String> stringClass = String.class

클래스 메타 데이터

  • 클래스 수준
    • 클래스 이름, 접근 제어, 기본 클래스
  • 생성자
    • 호출 가능한 기본 생성자 및 다중 정의된 생성자의 매개변수
  • 필드
    • 이름 및 형식, 접근 제어
  • 메서드
    • 이름, 매개변수 목록, 반환 자료 및 동적 호출

Class 클래스 객체

  • Object.getClass()
  • Class clazz = obj.getClass()
  • Class class = Class.forName("name")
    • 만약 인스턴스없다면 클래스 로더 개입, 클래스 로딩 됨

런타임에 클래스 로드

  • static Class.forName(String className)
  • 런타임에 클래스를 동적으로 로드하고 해당 클래스에 대한 Class 객체 반환
  • JDBC 드라이버 로딩, Reflection 기반 동적 객체 생성
  • 프레임워크에서 설정 파일 같은 것으로 지정한 클래스를 로드할 경우 유용
    • 소스코드가 아닌 설정 기반 객체 생성 가능

Class.forName() 동작 과정

  • 매개변수로 전달된 클래스(FQCN, Fully Qualified Class Name)대한 .class 파일을 JVM Class path에서 검색
    • 클래스 패스는 설정된 디렉토리나 JAR파일
    • java - classpath, java -cp 명령으로 설정 가능
    • 보통 CLASSPATH 환경변수로 설정
    • IntelliJ 사용 시 자동 관리
  • ClassLoader 클래스를 사용해 클래스를 로드하고 초기화

Java 클래스 로딩(파트2)

  • 클래스 로딩 및 링킹 과정이 모두 런타임에 이루어짐
  • 실행 성능 일부 저하될 수 있으나 높은 확장성과 유연성 제공
    • 인터페이스만 맞으면 Runtime에 구현 클래스 결정안해도 됨
    • 클래스 로더는 실행할 프로그램 코드를 네트워크로 수신하는 것도 가능
  • 해석(Resolution)단계는 동적 바인딩(혹은 늦은 바인딩)을 지원할 목적으로 초기화 후로 지연될 수 있음

리플렉션

  • Runtime에 클래스 메타 정보 얻는 방법
  • Java기반 응용 프로그램이 작동하는 중간에 특정 클래스가 가진 생성자, 메서드, 필드, 어노테이션 등에 관한 정보를 알아내는 방법
    • 단, 접근제어 무력화 시킴
    • Class.getDeclaredContstructors()
    • Class.getDeclaredFileds()
    • Class.getDeclaredMethods()
  • Java기반 모듈화 프로그래밍 지원
  • 클래스 메서드 코드는 인스턴스와 별개로 존재
  • 메서드 실행 시 인스턴스 필요

어노테이션과 리플렉션

  • 리플렉션으로 클래스 내부의 어노테이션 체크해서...