티스토리 뷰

SW개발/Java

Reflection 리플렉션

개소왕 2018. 12. 18. 10:41

* 개요

자바 리플렉션은 자바에서 정의된 클래스의 정보를 가지고 오기 위한 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);


* 현재 쓰레드에서 자신을 호출한 메서드 알아내기

http://wakeupjava.tistory.com/entry/Java-%EC%9E%90%EC%8B%A0%EC%9D%84-%ED%98%B8%EC%B6%9C%ED%95%9C-%EC%9D%B4%EC%A0%84-%EB%A9%94%EC%86%8C%EB%93%9C-%ED%98%B9%EC%9D%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A0%95%EB%B3%B4-%EB%B3%B4%EA%B8%B0




* Dynamic Proxy

http://babtingdev.tistory.com/308



* 메서드 파라메터의 이름을 가져오는 것은 가능한가?

https://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection




* 맺음말

사실 리플렉션을 이용할 일이 많지는 않다.

하지만 툴이나 프레임워크를 개발하거나 이해하기 위해 필수적으로 알아야 한다.


다음 예시에서 리플렉션에 대해 생각해볼 수 있다

스프링에서 Bean 을 Runtime 에 생성

이클립스에서 어떤 클래스의 메서드 목록을 출력

log4j 에서 로그를 찍는 클래스, 메서드가 무엇인지 출력

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함