본문 바로가기

언어/Java

리플렉션(Reflection)

※ 리플렉션

    객체에 대한 정보값을 알려주는 것. 문서를 요청하면 문서를 찾아내고 요청한 곳으로 문서 내용 그대로 응답

    확장자가 여러 조건(.html, .css, .js)을 제외하게 되면 그 요청을 처리할 엔진 영역과 서비스 영역으로 보냄
    엔진영역에서 파일 실행, if, else if...
    else if 계속만들어야해서 2가지 영역으로 나눔

    리소스를 보내서 확장자가 .jsp인지 아닌지만 나누고 .jsp는 jsp엔진에게 위임
    나머지는 설정파일을 제공해주고 요청에 해당하는(매칭하는) 서블릿 클래스를 찾아냄
    그 서블릿의 객체 생성하고 특정 메서드 호출 이걸 자동으로 함 → 리플랙션
    주로 엔진, 프레임워크 개발자가 할 일

public class ReflectionTest {	
	public static void main(String[] args) {
		String s;
		Date d;
	}
}

※ 위의 class가 실행되면 실행되는 파일 수
1. ReflectionTest.class 찾기
2. JVM으로 로딩, Load time Dynamic Load(동적로드)
3. 바이트코드 검색
4. 0,1 재해석(하다보면 필요한 클래스를 로드해오는데, 그때 추가로 필요한 클래스 로드하는걸
Load Time Dynamic Load라고 함) Method 영역에 기억시킴
5. static 변수 있으면 자동초기화
6. main() 메서드 호출

로드타임 시 실행되는 class들 :
ReflectionTest, Object, String[] class, Date class 들이 JVM 메모리 위에 올라와있고 main 메서드가 호출된다.

 

class 위에 커서 올리면 뜨는 팝업. 물음표는 반환한다는 뜻

 

public class ReflectionTest {
	public static void main(String[] args) throws ClassNotFoundException {
		Class.forName("java.util.Date");
		Class.forName("java.util.ArrayList");
	}
}

※ Load time Dynamic Load에서 5개의 클래스 실행됨
ReflectionTest, Object, String[] class, ClassNotFoundException class, Class 들이 JVM 메모리 위에 올라와있고

main 메서드가 호출된다.
실행 시에 로드되는 클래스(Run time Dynamic Load) : "java.util.Date" JVM 위쪽으로 로드됨

 

전달된 className에 따라 알아서 자동생성되게 하자. 리플랙션
deprecated 더 좋은게 나오거나 문제있으니 지금 버전에선 쓰지말라고 경고

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

public class ReflectionTest {
	public static void test(String className) throws ClassNotFoundException {
		Class c = Class.forName(className);
		Field[] fields = c.getDeclaredFields(); // Run time Dynamic Load된 필드 변수들 찾기
		for(Field f : fields) {
			System.out.println(f.getName());
		}
		System.out.println("--------------");
		Method[] methods = c.getDeclaredMethods(); //// Run time Dynamic Load된 class의 메서드 찾기
		for(Method m: methods) {
			System.out.println(m.getName());
		}
		try {
//			c.newInstance(); //객체 생성이 되는 것
			Object obj = c.getDeclaredConstructor().newInstance();
			System.out.println(obj); //obj.toString() 자동호출됨
		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | 
				 InvocationTargetException | NoSuchMethodException | SecurityException e) {
			e.printStackTrace(); //Exception의 내용을 스택형태로 차곡차곡 추적해서 출력한다. 디버깅할 때 쓸 것
		}
	}
	
	public static void main(String[] args) throws ClassNotFoundException {
		Scanner sc = new Scanner(System.in);
		System.out.print("클래스이름을 입력하세요 ex)java.util.Date:");
		String className = sc.nextLine();
        // sc.next(); ex) 서울시 송파구 입력했을 때 서울시만 출력
        // sc.nextLine(); ex) 서울시 송파구 전체 출력
		test(className);
	}
}

 

실행결과. java.util.date에서 제공하는 멤버변수와 메서드 목록
결과

'언어 > Java' 카테고리의 다른 글

예외(Exception)  (0) 2023.08.02
복제(shallow copy, deep copy)  (0) 2023.08.02
GUI프로그램  (0) 2023.08.02
인터페이스 예시  (0) 2023.08.02
인터페이스(Interface)  (0) 2023.08.01