티스토리 뷰
* 개요
자바 리플렉션은 자바에서 정의된 클래스의 정보를 가지고 오기 위한 API 이다.
선언된 클래스는 생성자, 메서드, 필드 등을 갖게 된다.
이러한 클래스의 정보들을 객체로 받아올 수 있다.
- 참고
http://gyrfalcon.tistory.com/entry/Java-Reflection
* 예제
흔히 사용하는 ArrayList의 클래스 정보를 가져오는 예제이다.
Class 란 이름의 클래스가 있으며, 여기에 클래스에 대한 정보가 담겨 있다. (java.lang.Class)
어떤 객체나 getClass() 를 통해 Class 객체를 가져올 수 있다.
ArrayList<String> lst = new ArrayList<String>();
Class<?> c = lst.getClass();
* getDeclaredFields() 를 통해 ArrayList 에 선언된 필드 목록 가져오기
// lst 의 필드 모두 출력
for(Field f : c.getDeclaredFields() ) {
System.out.println("field : " + f);
}
* getDeclaredMethods 를 통해 메서드 목록 가져오기
// lst 의 메서드 모두 출력
for(Method m : c.getDeclaredMethods() ) {
System.out.println("method : " + m);
}
* 특정 메서드 찾기
ArrayList 의 get(int) 란 메서드를 찾으려면...
Method m = c.getMethod("get", int.class);
System.out.println(m);
- 만약 지정한 메서드가 없다면 다음 예외가 발생한다
java.lang.NoSuchMethodException: java.util.ArrayList.get()
* Method 객체 통해서 메서드 직접 실행하기
ArrayList#get(0) 을 실행하는 예제
// lst : ArrayList 의 객체
// c : ArrayList에서 가져온 Class 객체
// m : ArrayList#get(int) 의 Method 객체
Method m = c.getMethod("get", int.class);
System.out.println(m);
lst.add("test!");
String s = (String) m.invoke(lst, 0);
System.out.println(s);
* 새로운 객체 만들기
- Class.forName 으로 클래스 정보를 runtime에 지정하여 가져올 수 있으며,
이를 토대로 객체를 만들 수 있다.
- new String("바보") 를 리플렉션 이용해 실행한 예제
// 새로운 객체 만들기
// Class<?> c;
// String s;
c = Class.forName("java.lang.String");
Constructor ct = c.getConstructor(String.class);
s = (String) ct.newInstance("바보");
System.out.println("내가 생성한 String : " + s);
* 현재 쓰레드에서 자신을 호출한 메서드 알아내기
* Dynamic Proxy
http://babtingdev.tistory.com/308
* 메서드 파라메터의 이름을 가져오는 것은 가능한가?
https://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection
* 맺음말
사실 리플렉션을 이용할 일이 많지는 않다.
하지만 툴이나 프레임워크를 개발하거나 이해하기 위해 필수적으로 알아야 한다.
다음 예시에서 리플렉션에 대해 생각해볼 수 있다
스프링에서 Bean 을 Runtime 에 생성
이클립스에서 어떤 클래스의 메서드 목록을 출력
log4j 에서 로그를 찍는 클래스, 메서드가 무엇인지 출력
'SW개발 > Java' 카테고리의 다른 글
TreeMap/ConcurrentSkipListMap 동기화 테스트 코드 (0) | 2018.12.18 |
---|---|
[종합] Collection / 컬렉션 검색, 정렬, 복사, 추가, 삭제 등 (0) | 2018.12.18 |
자바의 숨겨진 기능 (0) | 2018.12.18 |
맵 정렬 - TreeMap (0) | 2018.11.30 |
정리하다만/static (0) | 2018.11.19 |