티스토리 뷰

책을보다보니 자바의 리플렉션이라는 주제에 대해서 나왔다. 리플렉션이 뭔가 했더니 JVM에 인스턴스된 객체를 통해서

 

객체의 원래 클래스가 무엇인지, 어떤 메소드와 변수들을 제공하는지 등 클래스의 정보를 확인할수 있는 방법입니다. 

우리가 애용하는 자동완성 기능이 이 방법을 이용해서 제공되는거라고 하더군요...!

 

또 한 알아낸 메소드나 클래스 변수를 이용하여 실행 또는 수정까지 할 수 있습니다.

 

책에서는 리플렉션을 통해서 얻을수 있는 정보는 다음과 같다고 설명해줍니다.

1.클래스 이름

2.클래스의 제어자

3.패키지의 정보

4.클래스의 부모 클래스

5.클래스의 생성자

6.클래스의 메소드

7. 클래스의 변수

8. 클래스의 Annotation

 

이중에서 우리는 생성자,메소드,변수만을 다뤄볼것입니다.

 

우선 다음과 같은 클래스가 있다고 가정해봅시다.





이 클래스 파일의 정보를 얻기위해선 java.lang.Class 클래스가 필요합니다.

이 클래스에 대해서 더 알고 싶으신분은 여기를 참조하시면 됩니다. ( http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html )

대상 클래스를 이용하여 Class 객체를 받아오는 방법은 총 3가지 입니다.

1. 클래스.class
2. 객체.getClass()

3. Class.forName(패키지명을 포함한 클래스명)

 

위 3가지 방법중 상황에 맞게 사용하시고 얻어온 Class객체로 생성자,메소드,변수에 대해서 알아보겠습니다.

얻어오는 방법은 다음과 같습니다. Class객체.getDeclaredXXXX() 으로 받아오면 됩니다.

 

getDeclaredXXXX()은 명시적으로 선언되어 있는 정보들만 얻어옵니다.

 

만약 상속받은 정보까지 얻고 싶으시면 getXXXX()으로 받아오시면 됩니다.

다음 코드를 보시면 이 객체의 클래스 정보를 확인할수 있습니다.



결과 화면은 다음과 같습니다.




다음은 얻어온 생성자 정보를 이용해서 새로운 클래스를 만들어봅시다.

 

다음과 같이 getDeclaredConstructor를 통해서 생성자를 얻어옵니다.

 

우리는 초기화 변수가 필요한 생성자가 필요하니까 생성자 정보를 가져올때 사용되는 매개변수 타입에 대해서도 적어 놓습니다. 

 

그리고 초기화 변수를 만들어 놓은후 newInstance를 할때 초기화 변수를 집어 넣습니다.




결과화면은 다음과 같습니다.




그 다음은 알아낸 메소드를 이용해서 메소드를 실행해 보겠습니다.

다음과 같이 getMethod를 이용해서 메소드 정보를 가져온다음 invoke를 이용해 실행하면 끝입니다.

 

invoke의 첫번째 매개변수는 이 메소드를 실행할 객체를 뜻합니다.




결과화면은 다음과 같습니다.



 

다음은 객체의 변수에 접근해 값을 수정해 보겠습니다.

 

getDeclaredField를 이용해 변수에 접근한후 (private 변수의 경우 setAccessible을 true로 설정해줘야 접근이 됩니다.)

 

get 과 set을 이용해서 변수를 마음대로 수정할수 있습니다.




다음은 결과 화면 입니다.


 

처음에 리플렉션에 대해서 봤을땐 이건 뭔가 했는데 보다보니 익숙해지고

 

생각해보니 예전에 사용해봤던 방법이였습니다. 이름이 리플렉션인줄 몰랐을뿐 -_-;

 

그땐 급하게 처리하느라 막썼는데 어쨌든 복습할수 있는 좋은 기회였고 나름 재미있는 주제였습니다.

 

혹시 몰라서 샘플로 만든 프로젝트도 추가해놨습니다. 필요하신분들은 다운받으세요 ^^;

 

누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~ 

댓글