본문 바로가기
  • soobinhand의 기술 블로그
도서/자바 프로그래밍 언어 - James Gosling

[자바 프로그래밍 언어] 16장 리플렉션

by soobinhand 2022. 1. 5.
728x90

16.1     Class 클래스

  • java.lang.reflect 패키지는 타입을 자세하게 검사할 수 있는 리플렉션 클래스를 포함하고 있다. 이 클래스를 사용하면 완벽한 타입 브라우저를 작성하거나 사용자가 작성한 코드를 번역하는 애플리케이션을 작성할 수 있다.
  • 리플렉션을 위해서는 가장 먼저 Class 객체를 사용해야 한다.
  • 클래스의 완전한 이름 ( 예를 들어, java.lang.String )이 주어지면 프로그램은 정적 메소드 Class.forName을 사용해 클래스의 Class 객체를 얻는다.
  • Class 객체는 모든 타입, 즉 클래스, enum, 인터페이스, 어노테이션, 배열, 기본 타입을 나타낼 수 있다.
  • Class 클래스는 리플렉션의 시작 시점으로써 지정된 문자열을 이름으로 가지는 타입의 객체를 생성하거나 특수한 기법을 사용하여 네트워크상의 클래스를 로딩하는 등의 클래스를 조작하는 도구를 제공한다.
  • Class는 Class<T>로 선언되어 있는 제네릭 클래스이다. 참조 타입의 Class 객체는 이 타입을 나타내는 클래스에 대응하는 매개변수화된 타입이다. 그래서 String.class 타입은 Class<String>이다.
  • 매개변수화된 Class타입은 주어진 클래스의 타입 토큰이라고 한다. 타입 토큰을 가장 쉽게 얻을 수 있는 방법은 String.class와 같이 클래스 리터럴을 사용하는 것으로 이는 가장 정확한 타입 토큰을 제공한다.
  • Class 클래스는 특정 클래스에 대한 정보를 획득할 수 있는 메소드를 여러 개 제공한다.
  • Class 클래스는 클래스의 구성요소, 즉 필드, 메소드, 생성자, 중첩 타입을 검사할 수 있는 메소드를 포함하고 있다.
  • 프로그램을 작성할 때, instanceof를 사용하거나 캐스트를 사용하여 표현식의 타입을 변경하는 것으로 객체 타입을 검사할 수 있다. 하지만 리플렉션으로 작업하면 사용 불가.

16.2     어노테이션 질의

  • 어노테이션 질의는 런타임 시에 사용할 수 있는 어노테이션 상의 정보만을 제공할 수 있다.

16.3     Modifier 클래스

  • Modifier 클래스는 비 어노테이션 제한자들을 모두 int 상수, 즉 ABSTRACT, FINAL, INTERFACE, NATIVE, PRIVATE, PROTECTED, PUBLIC, STATIC, STRICT, SYNCHRONIZED, TRANSIENT, VOLATILE로 정의하고 있다. 이 상수들은 모두 질의 메소드 isMod를 가지고 있다. 이 메소드는 제한자 mod가 지정된 값에 존재하면 true를 반환한다.

16.4     Member 클래스

  • Field, Constructor, Method 클래스는 모두 Member 인터페이스를 구현하며 Member 인터페이스는 모든 멤버들이 공유하는 속성 정보를 얻기 위해 사용할 수 있는 메소드를 보유하고 있다.

16.5     접근 검사와 AccessibleObject

  • Field, Constructor, Method 클래스는 모두 AccessibleObject 클래스의 서브 클래스이다. AccessibleObject는 public과 private과 같은 접근 제한자를 검사하거나 하지 못하게 할 수 있다. 통상적이고 명시적인 코드에서 필요로 하는 접근 검사는 리플렉션을 사용한 멤버 접근 시에도 필요하다.

16.6     Field 클래스

  • Field 클래스는 필드 타입을 요청하고 필드 값을 설정하거나 얻을 수 있는 메소드를 정의한다. 상속한 Member 메소드와 조합하여 이 클래스를 사용하면 필드 선언과 관련된 모든 것을 찾거나 지정된 객체나 클래스의 필드를 조작할 수 있다.

16.7     Method 클래스

  • Member에서 상속한 메소드와 Method 클래스의 메소드를 함께 사용하면 메소드 정보를 모두 얻을 수 있다.

16.8     새로운 객체 생성 및 Constructor 클래스

  • Class 객체의 newInstance 메소드를 사용하여 이 Class가 나타내는 타입의 새로운 인스턴스를 생성할 수 있다. 이 메소드는 클래스의 무인자 생성자를 호출하며 새로 생성한 객체의 참조를 반환한다. Class<T> 타입의 클래스 객체의 반환 객체는 T 타입이다.
  • 이 방법을 사용하면 사용자가 지정한 클래스의 객체를 생성할 수 있는 코드를 작성할 수 있다.
  • 내부 클래스 (지역, 익명 내부 클래스 제외)는 무인자 생성자를 절대 가질 수 없다. 왜냐하면 컴파일러가 모든 내부 클래스 생성자를 변경하여 외부 객체의 참조를 첫 번째 매개변수로 받을 수 있도록 하기 때문이다.

16.9     제네릭 타입 인스펙션

16.10     배열

  • 배열은 객체이지만 멤버를 가지고 있지 않다. 배열 길이를 나타내는 필드는 실제로 존재하는 필드가 아니다.
  • 배열을 생성하고 배열에 저장된 요소들의 값을 get하거나 set하기 위해서는 Array클래스의 정적메소드를 사용해야 한다.

16.11     패키지

  • Class 객체에서 getPackage를 호출하면 해당 클래스의 패키지를 설명하는 Package 객체를 얻을 수 있다. 정적 메소드 getPackage를 패키지 이름과 함께 호출하여 Package객체를 얻을 수 있다.
  • Package 객체들은 다른 리플렉션 타입과는 사용법이 다르다. 그래서 런타임 시에 패키지를 생성하거나 조작할 수 없다.

16.12     Proxy 클래스

  • Proxy 클래스는 한 개 이상의 인터페이스를 구현하는 클래스를 런타임 시에 생성할 수 있게 해준다.
  • 이 클래스는 향상된 기능을 가지고 있지만 거의 필요하지 않은 기능이다.

16.13     클래스 로딩

  • 런타임 시스템은 클래스를 필요할 시점에 로딩한다. 클래스 로딩은 런타임 시스템 구현에 따라 다양할 수 있다.
  • 하지만 대부분의 시스템은 런타임 시스템으로 로딩되지 않았더라도 클래스 패스 매커니즘을 사용해서 코드에서 참조하고 있는 클래스를 찾는다.

16.14     런타임 시에 검증 제어하기

728x90

댓글