오늘은 Reflection에 대해서 이야기 해보려고 한다.
Reflection 개요
JVM에는 RTTI 시스템이 내장되어있다.
RTTI란 RunTime Type Information의 줄임말인데, 실행시간에 타입의 정보를 알아내는 것이라고 볼 수 있다.
이는 자바에서 쉽게 사용할 수 있도록 클래스화 시켜놓기도 하였다.
보통 클래스를 통해 객체의 정보를 알아 낼 수 있는데,
클래스가 아닌 동적으로 메모리에 생성된 객체를 통해 클래스의 정보를 알아내는 것을 Reflection이라고 볼 수 있다.
API문서를 보면 reflect 패키지 내부에 있는 클래스들이 있다.
위에 설명한 RTTI를 이용할 수 있게 만들어진 클래스들이며,
이 클래스는 생성한 객체의 인스턴스 타입, 메소드를 '동적'으로 접근하게 해주는 JAVA Class이다.
주로 Class 클래스 (클래스 이름이 클래스이다.)와 같이 사용한다.
왜 Class 클래스와 같이 사용하는가?
일단 객체는 클래스로 만들어져있고, 그 클래스의 정보들을 모아놓은 곳이 바로 Class 클래스이다.
우린 가끔 클래스의 정보를 알아내야할 때가 있다. 특히, 객체 인스턴스의 정보는 거의 모르기 때문에 필수로 사용된다.
이것은 제네릭과 더불어 유연한 프로그래밍에 많은 도움이 된다.
사람의 눈은 클래스의 정보를 직관적으로 볼 수 있는데,
요새 나오는 IDE툴은 클래스의 정보도 모르면서,
어떻게 자동완성을 그렇게 빨리하는 가에 대한 의구심이 생긴다.
특히 IDE 툴의 경우에는, 우리가 코드를 친 상태에서 조금 긴 시간 대기를 하게되면
옆에 자동완성처럼 뜨는 기능이 많다.
기본적으로 IDE 툴같은 경우에는
자동으로 컴파일을 한 후, Class Loader가 JVM위에 올려놓은 Class정보를 기반으로 자동완성을 시키는 것이다.
갑자기 이 얘기를 왜 하냐면,
JVM(Java Virtual Machine)이 동작할 때, Class Loader가 Class정보를 다 static area에 올려놓기 때문에
static area에 올라간 클래스 정보에 접근 할 수가 있다는 것을 잘 활용한 예제이기 때문에 먼저 설명하였다.
Class 클래스와 reflect 패키지 내부에 있는 것들은
결국 static area에 있는 클래스 정보들을 이용하는 것과 같다고 볼 수 있다.
간단한 예제
class A
{
public void m()
{
System.out.println("pack.A.m()");
}
}
class B extends A
{
public B()
{
System.out.println("pack.B()");
}
public void m()
{
System.out.println("pack.B.m()");
}
}
public class ClassTest{
public static void main(String[] args) throws
ClassNotFoundException, // 해당 클래스가 없거나 클래스 패스 상에 없을때
IllegalAccessException, // method가 접근 지정자 문법을 위반
InstantiationException // 추상 클래스 및 인터페이스 일 경우
{
A a = new B();
Class c1 = a.getClass(); // 클래스 정보를 알아옴,
System.out.println(c.getName()); // B를 생성했으니 B를 가져옴.
c1.newInstance(); // 생성자 호출(B)
Class c2 = Class.forName("B"); // 클래스의 정보를 동적으로 알아온다.
//정보를 바탕으로 동적으로 생성한 뒤, 메서드를 호출한다. 대신 캐스팅을 해야한다.
((A))c2.newInstance()).m();
// 클래스에 대한 일반적인 정보
String test = "abcdef";
System.out.println(test.getClass().getName());
}
}
Class 클래스에 대한 간단한 예제이다.
reflect는 annotation을 다룰 때 짚고 넘어갈 예정이다.
결론 및 요약
Class 클래스와 Reflect패키지 안에 있는 것들은 객체를 동적으로 생성할 때, 클래스의 정보를 알아 올 때 많이 사용한다.
그리고 동적으로 할당된 객체의 정보를 활용하는 것을 거울에 비춰보는 것과 같다고 하여 Reflection 이라고 한다.
'Java' 카테고리의 다른 글
로그백 실행방법(logback, java) (0) | 2019.11.07 |
---|---|
자바 콘솔에서의 다양한 실행방법(jar, 빌드) (0) | 2019.11.07 |
자바 익명클래스와 자바 람다 (Java Anonymous class, Java Lambda) 1편 (0) | 2019.08.18 |
JAVA Exception 예외, 사용자 정의 예외처리 만드는법 (0) | 2019.08.05 |
Comparable, Comparator를 이용한 객체간 크기 비교 (0) | 2019.07.30 |