Java Reflection Action

Ryan Yang·2021년 9월 14일
0

Java Reflection Action 을 읽고 정리하는 포스팅입니다.

이 책에 대하여

  • 챕터 1 ,2 ,3. 자바 리플렉션의 기초를 다룸; 동적으로 클래스, 메서드, 필드, 생성자 조사 및 클래스 로드
  • 챕터 4. 동적 프록시
  • 챕터 5. 콜 스택 검사
  • 챕터 6. 사용자 정의 클래스 로더. 일부 문제는 클래스 로더가 로드 될 때만 사용할 수 있는 메타 데이터 수집이 필요해서 이 주제를 다룸
  • 챕터 7, 8. 리플렉션 코드 생성. 클래스 간 변환, 클래스에 프로퍼티 추가
  • 챕터 9. 리플렉션 디자인 결정을 내리기 위한 성능 측정 기술 소개
  • 챕터 10. 자바 리플렉션의 미래와 다른 언어가 자바 리플렉션과 AOP에 미치는 영향
  • 부록 A. 학술적인 관점에서 리플렉션과 고급 논문을 읽을 때 접하게될 리플렉션의 역사와 전문용어를 소개
  • 부록 B. "Hello World!"를 동적으로 컴파일 하는 프로그램에서 컴파일 오류를 처리하는 방법
  • 부록 C. 리플렉션 프로그램 다이어그램에 대한 UML 규칙 요약

1. 몇 가지 기본 사항

  • 리플렉션은 실행 중인 프로그램이 자신과 소프트웨어 환경을 검사하고 발견한 내용에 따라 수행하는 작업을 변경하는 기능
  • 메타 데이터: 검사를 수행해서 묘사된 정보
  • 메타 객체: 메타 데이터를 구성하는 객체
  • introspection(자기 성찰): 메타 오브젝트의 런타임 자체 검사
  • Dog는 Dog 클래스를 나타내는 메타 개체, fido 개체는 Dog의 인스턴스. instanceOf는 base level 개체와 metalevel 개체를 연결
    figure 1.1

런타임에 메서드 찾기

메서드설명
Method getMethod(String name, Class[] parameterTypes)두 번째 매개변수(parameterTypes)로 지정된 서명을 사용하여 대상 Class 객체의 공개(public) 메서드(선언되거나 상속됨)를 나타내는 Method 객체를 반환
Method[] getMethods()대상 Class 객체에서 지원하는 모든 공개(public) 메서드(선언되거나 상속됨)를 나타내는 Method 객체의 배열을 반환
Method getDeclaredMethod(String name, Class[] parameterTypes)두 번째 매개변수(parameterTypes)로 지정된 서명을 사용하여 (부모를 제외하고) 대상 Class 객체의 선언된 메서드를 나타내는 Method 객체를 반환
Method[] getDeclaredMethods()대상 Class 객체에 선언된 (부모를 제외하고) 모든 메서드를 나타내는 메서드 개체의 배열을 반환합니다.
  • getMethodgetDeclaredMethodparameterTypesnull 인 경우 인자가 0개인 메서드를 가져옴
  • NoSuchMethodException - 메서드를 찾지 못햇을 경우
  • SecurityException - 외부 패키지에서 메서드를 가져올 때 서명 정보가 맞지 않는 경우

클래스 객체로 유형 표현하기

메서드설명
String getName()대상 클래스 객체의 완전한 이름(fully qualified name)을 반환
Class getComponentType()대상 객체가 배열에 대한 Class 객체인 경우, 구성 요소 유형을 나타내는 Class 객체를 반환. ex: int[][].class.getComponentType()int[],
boolean isArray()대상 Class 객체가 배열인 경우 true 반환
boolean isInterface()대상 Class 객체가 인터페이스인 경우 true 반환
boolean isPrimitive()대상 Class 객체가 기본(primitive) 타입 (int, char, boolean 등) 혹은 void인 경우 true 반환

메서드 객체 이해

메서드설명
Class getDeclaringClass()메서드를 선언한 Class를 반환
Class[] getExceptionTypes()메서드에 발생한다고 선언된 예외의 Class의 배열을 반환
int getModifiers()메서드에 대한 수정자를 int로 반환, (int에 대응되는 값은 java.lang.reflect.Modifier에 상수로 선언)
String getName()메서드 이름
Class[] getParameterTypes()선언된 순서대로 메서드의 형식 매개 변수의 Class의 배열을 반환
Class getReturnType()메서드가 반환하는 유형을 나타내는 Class를 반환
Object invoke(Object obj, Object[] args)Object 배열(args)에 지정된 인수를 사용하여 지정된 객체에서 이 Method 객체가 나타내는 메서드를 호출
  • IllegalAccessException - 해당 메서드를 지원하지 않는 객체에서 invoke 호출한 경우
  • IllegalArgumentException - invoke 인수가 잘못된 경우
  • InvocationTargetException - invoke 시 호출한 메서드 내부에서 예외가 발생했을때 발생한 예외의 래퍼(wrapped) 클래스

상속 계층 조사

메서드설명
Class[] getInterfaces()대상 Class의 직접적인 부모 인터페이스의 Class의 배열을 반환
Class getSuperclass()대상 Class의 직접적인 부모 클래스를 나타내는 Class를 반환하거나 대상이 Object, 인터페이스, 기본(primitive) 타입 또는 void인 경우 null을 반환
boolean isAssignableFrom(Class cls)대상 Class가 나타내는 클래스 또는 인터페이스가 지정된 Class 매개변수(cls)의 부모 클래스 또는 부모 인터페이스와 같은 경우에만 true를 반환
boolean isInstance(Object obj)지정된 Object가 대상 Class가 나타내는 객체와 할당 호환이 가능한 경우에만 true를 반환

2. 리플렉션을 통한 필드 접근

런타임에 필드 찾기

메서드설명
Field getField(String name)이름과 일치하는 클래스 또는 인터페이스의 public 멤버 필드를 나타내는 Field 객체를 반환
Field[] getFields()클래스 또는 인터페이스의 모든 액세스 가능한 공용 필드를 나타내는 Field 객체의 배열을 반환
Field getDeclaredField(String name)이름과 일치하는 클래스 또는 인터페이스의 선언 필드를 나타내는 Field 객체를 반환
Field[] getDeclaredFields()클래스 또는 인터페이스에 선언된 각 필드를 나타내는 Field 객체의 배열을 반환

필드 객체 이해하기

(작성중...)

0개의 댓글