JAVA 리플렉션

Kevin·2022년 5월 8일
0

JAVA

목록 보기
1/1

JAVA의 Reflection API란?

구체적인 클래스의 타입을 모르더라도, 클래스의 변수, 타입, 메소드 들을 접근 할 수 있도록 해주는 자바 API이다.

"구체적인 클래스 타입을 알지 못한다면 메소드를 실행 할 수 없다."

public class Aniaml{
	public void eat(){
    	//Anything
    }
 }
 public class Main{
	public static void main(String[] args){
    	Object dog = new Animal();
        dog.eat(); // 컴파일 에러
    }
 }

위와 같은 코드에서 컴파일 에러가 나는 이유는, 모든 조상 클래스인 Object 라는 Type으로 Animal 클래스의 인스턴스를 담을 수 는 있지만, 사용 가능한 메소드는 Object의 메소드와 변수들 뿐이므로, Animal의 메소드를 사용할 수가 없다.

이처럼 구체적인 Type의 Class를 모를 때, 사용하는 것이 리플렉션이라고 한다.

"본인이 작성한 코드인데, 사용할 클래스의 이름과 타입을 모르는 경우가 있는가?"

보통 이런 경우는 잘 없지만, 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르는 경우가 있다. 이럴 때는 실행할 시점, 그러니까 런타임에 지금 실행되고 있는 클래스를 가져와서 실행을 해야하는 것이다.

대표적으로 프레임워크나 IDE에서 이런 동적 바인딩을 이용한 기능을 제공하는데 InteliJ의 자동완성, 스프링 프레임워크의 어노테이션과 같은 기능이 바로 설계할 때는 사용될 클래스가 어떤 타입인지 모르지만 리플렉션을 이용해서 코드를 일단 작성하고 실행 시점에 확인해서 활용할 수 있도록 하는 메커니즘이다.

Reflection은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근 할 수 있도록 해주는 Java API

이게 어떻게 가능한 것인가?

자바 클래스 파일은 바이트 코드로 컴파일되어 Static 영역에 위치하게 된다. 때문에 클래스 이름만 알고 있다면, 언제든 이 영역을 뒤져서 클래스에 대한 정보를 가져올 수 있는 것이다. 아래는 가져올 수 있는 정보들이다.

ClassName
Class Modifiers (public,private,synchronized 등)
Pacakge Info
Superclass
Implemented Interfaces
Constructors
MethodsFields
Annotations

profile
성장해나가는 개발자입니다.

0개의 댓글