Refletion이란?
투영, 반사라는 사전적 의미
객체를 통해 클래스의 정보를 분석하는 기법을 말한다.
자바에서 동적으로 인스턴스를 생성하기 위해 java.lang.reflet api를 통해 제공하고 있다.
이를 이용하면 동적으로 클래스를 생성할 수 있을 뿐만 아니라, 클래스의 메소드를 실행할 수 있다.
예제코드)
다음과 같은 클래스가 있다고 가정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class TargetClass { /* * reflection 되어질 객체 */ public void firstMethod() { System.out.println("첫번째 매소드"); } public void secondMethod(String name) { System.out.println("두번째 메소드"); } public void thirdMethod(int n) { for(int i=0;i<n;i++) { System.out.println("세번째 메소드"); } } } | cs |
클래스의 이름을 입력하여 클래스를 찾고 클래스의 선언된 메소드들 찾기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) { /* * 클래스의 선언된 메서드를 찾는 방법 */ try { Class targetClass = Class.forName("co.kr.javastudy.reflection.TargetClass"); //java.lang.Class의 forName()메소드를 통해 클래스를 찾음 Method methods[] = targetClass.getDeclaredMethods(); //getDeclaredMethods()를 통해 해당 클래스의 메소드들을 찾음 for(int i=0;i<methods.length;i++) { System.out.println(methods[i].toString()); } } catch (ClassNotFoundException e) { System.out.println("클래스를 찾을 수 없습니다."); } } } |
클래스의 선언된 메소드들의 이름 출력
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 | import java.lang.reflect.Method; public class ReflectionExample2 { public static void main(String[] args) { /* * 클래스의 선언된 메서드이름을 출력 */ try { Class targetClass = Class.forName("co.kr.javastudy.reflection.TargetClass"); Method methods[] = targetClass.getDeclaredMethods(); for(int i=0;i<methods.length;i++) { String findMethod = methods[i].getName(); //method의 이름 추출 System.out.println(findMethod); } } catch (ClassNotFoundException e) { System.out.println("클래스를 찾을 수 없습니다."); } } } | cs |
찾은 메소드를 동적으로 호출
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 32 33 | import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectionExample3 { public static void main(String[] args) { /* * 이름을 지정해 특정 메소드를 실행시키는 방법 */ try { TargetClass target = new TargetClass(); //해당 클래스의 인스턴스 생성 Class targetClass = Class.forName("co.kr.javastudy.reflection.TargetClass"); Method methods[] = targetClass.getDeclaredMethods(); for(int i=0;i<methods.length;i++) { String findMethod = methods[i].getName(); if(findMethod.equals("secondMethod")) { //secondMethod를 찾아서 실행 try { methods[i].invoke(target,"리플렉션"); //invoke()를 통해 메소드 호출 가능 //첫번째 파라미터는 해당 메소드를 가진 인스턴스, 두번쨰 파라미터는 해당 메소드의 파라미터 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } } } catch (ClassNotFoundException e) { System.out.println("클래스를 찾을 수 없습니다."); } } } | cs |
** 리플렉션을 통해 파라미터, 부모 클래스, 패키지, Modifier, Fields, Annotaion 등 다양한 정보를 알아낼 수 있다.
자세한 것은 java api문서를 참고하면 좋을 것 같다.
'Java' 카테고리의 다른 글
오버로딩 vs 오버라이딩 (0) | 2017.05.16 |
---|---|
JAVA 특징와 OOP (0) | 2017.05.12 |
[Collection] 동기화된 컬렉션 (0) | 2017.03.10 |
[람다식]메소드와 생성자 참조 (0) | 2017.03.08 |
[람다식] 클래스 멤버와 로컬변수의 사용 (0) | 2017.02.24 |