본문 바로가기

Programinng/Java

자바(Java) - Reflection 리플렉션 (RTTI : Run-Time Type Information)

RTTI(Run-Time Type Information)을 이용하면 실행중에 타입 정보를 알아내고 사용할 수 있다. 이는 매우 까다롭고 복잡한 문제점들을 쉽고 빠르게 해결 할 수 있고, 굉장히 강력한 프로그램을 작성 할 수 있게 도와준다. 하지만 이는 객체 지향적인 프로그래밍 방법을 위배하고, 코드의 가독성을 떨어트린다는 의견도 있다. 그렇지만 이런 강력한 기능의 유혹을 벗어나긴 힘들다. 그리고 실제 여러 Framework에서 RTTI를 잘 활용 하고 있다. (특히나 Spring Framework)



자바에서는 모든 .class 파일 하나당 java.lang.Class 객체 하나씩 생성된다. Class는 모든 .class들의 정보를 가지고 있으며 .class파일에 같이 저장된다. 모든 .class들은 이 클래스를 최초로 사용하는 시점에서 동적으로 ClassLoader을 통해 JVM에 로드된다. 


최초로 사용하는 시점이라면 해당 .class에서 static을 최초로 사용할때를 말한다. (생성자도 static 메소드이다.  그렇기 때문에 new를 하게 되면 로드된다고 보면 된다. 이를 동적 로딩이라 한다.) 


이렇게 .class의 정보와 Class객체는 JVM에 Run Time Data Area의 Method Area에 저장된다.


그리고 이러한 정보들을 java.lang.reflect 에서 접근할 수 있게 도와 준다.  이 패키지에서는 Field, Method, Constructor같은 class들이 있고,  Constructor를 통해 새로운 객체를 생성하고, getter method와 setter method를 통해 Field의 값을 읽거나 수정할 수 있다. 또 invoke method를 통해 method를 호출한다. 그 외에도 parameter, return type, modifier 등 class의 관련된 모든 정보를 알아올 수 있고 조작할 수 있다. 심지어 private으로 Encapsulation된 immutable한 것들 까지도 setAccessible을 통해 접근, 조작 할 수 있다.