목차
- Spring 핵심원리 고급편 - CGLIB
- Spring 핵심원리 고급편 - Dynamic Proxy 2
- Spring 핵심원리 고급편 - Dynamic Proxy 1
- Spring 핵심원리 고급편 - 리플렉션
- Spring 핵심원리 고급편 - 구체 클래스 기반 프록시 적용 2
- Spring 핵심원리 고급편 - 구체 클래스 기반 프록시
- Spring 핵심원리 고급편 - 인터페이스 프록시 1
- Spring 핵심원리 고급편 - Decorator Pattern 2
- Spring 핵심원리 고급편 - Decorator Pattern 1
- Spring 핵심원리 고급편 - Proxy 패턴 컴포넌트 스캔으로 자동 빈 등록
- Spring 핵심원리 고급편 - Proxy 패턴 인터페이스 없는 없는 구체 클래스
- Spring 핵심원리 고급편 - Proxy 패턴 인터페이스와 구체 클래스
- Spring 핵심원리 고급편 - Proxy 패턴
- Spring 핵심원리 고급편 - Strategy 패턴
- Spring 핵심원리 고급편 - Template Method 패턴
리플렉션
구체적인 클래스 타입을 알지 못해도 해당 클래스의 메소드, 타입, 변수들을 사용할 수 있도록 하는 자바 API
자바 Reflection 은 실행 중인 자바 프로그램 에서 클래스 정보에 접근하도록 하는 기술입니다.
Reflection을 사용하면 클래스나 인터페이스의 이름, 필드의 이름, 타입 및 값, 메서드의 이름, 파라미터 타입 등의 정보를 가져오고 조작할 수 있습니다. 이를 통해 객체의 생성, 필드값 설정, 메서드 호출 등을 동적으로 수행할 수 있습니다.
리플렉션 - API
클래스 정보 가져오기 - forName
Class 클래스의 forName 메서드를 사용하여 클래스 정보를 가져옵니다. 예를 들어, 다음과 같이 클래스 정보를 가져올 수 있습니다.
Class<?> myClass = Class.forName("com.example.MyClass"); |
메서드 정보 가져오기 - getMethod
Class 클래스의 getMethod 메서드를 사용하여 메서드 메타정보를 가져옵니다. 또한, 메서드 호출시 파라미터 값들이 필요한 경우 parameterTypes 를 사용하여 메서드의 파라미터 타입을 배열 형태로 지정할 수 있습니다.
Class<?> myClass = Class.forName("com.example.MyClass"); |
메서드 호출하기 - invoke
Reflection을 사용하여 메서드를 호출할 때는 Method 클래스의 invoke 메서드를 사용하여 target 객체내 메서드를 호출할 수 있습니다.
Class<?> myClass = Class.forName("com.example.MyClass"); |
target 객체내 메소드 호출시 다음과 같이 파라미터 타입을 지정해서 호출할 수도 있습니다.
Class<?> myClass = MyClass.class; |
필드 정보 가져오기 - getField
Class 클래스의 getField 메서드를 사용하여 필드 정보를 가져옵니다.
Class<?> myClass = Class.forName("com.example.MyClass"); |
필드 값 가져오기 - get
Field 클래스의 get 메서드를 사용하여 target 객체내 필드 값 정보를 가져옵니다.
Class<?> myClass = Class.forName("com.example.MyClass"); |
Reflection 사용하기
|
Reflection 적용
전체 코드 흐름은 비슷하고 중간에 호출하는 메서드 하나만 다르다.
log.info("start"); |
|
15:14:29.958 [Test worker] INFO hello.proxy.jdkdynamic.ReflectionTest$Hello - callA |
|
리플렉션 단점
클래스와 메서드의 메타정보를 이용한 리플렉션 기술은 런타임 에 동작하기 때문에 컴파일 시점에서 에러를 잡을 수 없다.