DevBoi

Java 리플렉션 이란? 본문

Language/[Java]

Java 리플렉션 이란?

HiSmith 2021. 12. 6. 20:48
반응형

자바 리플렉션? 반사? 이게 뭥미라는 사람들이 점차 많아진다.

 

사용방법은 아래와 같다

 

 

1. 리플렉션 이란?

자바에서 제공하는 API 로써, 실제로 그 클래스 타입을 알지 못해도, 해당 해당 하는 타입의 메소드와 타입, 변수를 접근 할수 있게 해준다.

 

2.리플렉션을 왜씀?

자바는 정적언어라, 한계가 많은데 동적으로 필요한 부분을 지원해주기 위해서 해당 API를 제공해준다.

 

  • 정적 언어: 컴파일 시점에 타입을 결정 ex) Java, C, C++ 등..
  • 동적 언어: 런타임 시점에 타입을 결정 ex) Javascript, Python, Ruby 등..

 

애플리케이션 < 프레임워크, 라이브러리 같이, 애플리 케이션을 도와주는 곳에서 많이 쓰이는 기술이다.

스프링 프레임 워크에서 사용 예를 들면, Controller, Autowired등과 같이, 다양한 타입의 클래스들을 스프링 프레임워크가 다 커버업해주는 것이다.

기존에 있던, 클래스 세션 유저라는 녀석을 가지고 와서,

클래스 타입 변수 타입등을 보여주고 출력하는 소스이다.

 

자 그럼 리플렉션에 대해서 조금 더 응용을 해보자

리플렉션의 사용을 위해, 임의의 어노테이션을 생성한다.

추가로, ContainerService라는 서비스를 생성한다.

이 서비스에서는 두가지 메소드를 지원한다. 실질적으로, 외부에 노출되는 메소드는 한개라고 보면된다.

우선 getObject를 사용해서, 해당 클래스를 주입해주는 녀석이다.

해당 소스를 보면, 생성자를 찾아서 newInstance로 생성해주는 createInstance라는 녀석을 사용한다.

해당 메소드를 사용해서 전달 받은 클래스를 인식, TestRetentaion라는 어노테이션을 사용한 필드에 대해서 해당 타입의 object를 생성하여, 가져온 인스턴스를 set하고 리턴한다.

 

자 그러면 사용방법을 실질적으로 예를 들어서 사용해보자

우선 DI를 위해서 PracticeController와, PracticeService가 존재한다고 해보자

또한, PracticeController에서는 해당 서비스의 메소드를 호출하고, 해당 메소드에서는 gd라는 string을 출력한다고 예를 들어보자

 

 

내가 만든 어노테이션에 대한 선언을 한다

추가로, 해당 컨트롤러에서는  서비스의 메소드를 호출,

 

요런식으로 되어있다.

 

이러고,

이러면, 정상적으로 gd이 호출이 된다.

어떤 이유에서 되는걸까?

아까 만들었던, 소스에 주석을 달아보자

 

 

리플렉션은 동적으로 다양한 클래스 타입에 제약없이 해당 메소드에 대한 접근, 변수에 대한 접근을 가능하게 해준다.

주로 사용하는 메소드들이 존재하며, DI 프레임워크등, 공통 유틸 및 라이브러리 기능들 같은 케이스들을 개발할때

리플렉션을 사용하면, 굳이 클래스 타입별로 호출하지 않아도, 기능을 커버업 하게 해준다.

 

 

지나친 사용은, 이미 인스턴스가 존재함에도, 리플렉션을 통해 접근하면, 성능이슈가 발생할수 있다.

또한, private같이 접근 지시자에 대한 설정을 무시해 버릴수가 있기 때문에 너무 과도한 사용은 하면 안된다.

 

반응형

'Language > [Java]' 카테고리의 다른 글

[JAVA] 스택 & 힙 & Garbage Collector  (0) 2022.02.18
[Java] 제네릭의 이해  (0) 2022.02.17
JAVA stream _ 심화  (0) 2021.09.05
JAVA stream 사용 예제_1  (0) 2021.09.02
Java Garbage Collection 이란?  (0) 2021.07.21