본문 바로가기
Java

Reflection API

by MOVE🔥 2020. 3. 16.
728x90
반응형

Reflection API 란

체를 통해 클래스의 정보를 분석해 내는 프로그램 기법

구체적인 클래스 타입을 알지 못해도 클레스의 메소드, 타입, 변수 들을 접근하고 동적으로 인스턴스를 생성할 있도록 해주는 자바 API다.

 

어떻게 동작하는가?

자바 클래스 파일은 바이트 코드로 컴파일되어서 static 영역에 존재한다.  때문에 클래스 파일의 이름만 알면 클래스에 관한 정보를 가져올 수 있다.

 

활용

  • 애플리케이션의 런타임 동작을 검사하거나 수정해야하는 프로그램에서 사용된다.

  • 스프링 프레임워크에서도 자동 매핑과 여러 기능을 쓰기 위해 리플렉션을 사용

  • JDBC

    • JDBC에서 실행전까지 어느 드라이브를 사용할지 모른다.

    • Class.forName("oracle.jdbc.driver.OracleDriver"); 이 것을 사용하여 런타임시에 동적으로 클래스를 로딩

  • Java Serialization (직렬화)

    • Java.io.ObjectInputStream 클래스의 readObject 메서드는 내부적으로 Reflection 이용하여 직렬화된 객채의 readObject 메소드를 호출한다. (클래스 내부에 선언되어있는 변수들 이름 타입 가져오는데 사용할 같다)

 

 

여기서부턴 예제...

 

아래 예제는 CarName을 입력받아 Car 객체 및 생성자를 생성하고, 메소드를 호출 하는 예제다.

public class CarCenter {


	public static int MAX_RENT_COUNT = 5;

	static Scanner sc = new Scanner(System.in);
	static String carName = "";
	static int runTime = 1;

	public static void main(String[] args) {

		// 차고 Setting
		HashMap<String, String> garage = new HashMap<String, String>();
		garage.put("B","Car.Benz");
		garage.put("F","Car.Ferrari");
		garage.put("L","Car.Lamborghini");
		garage.put("P","Car.Porsche");
		garage.put("R","Car.RollsRoyce");

		String rentName = "";
		
		while(garage.get(rentName) == null) {
			System.out.println("차고에 있는 차는 "+ garage.keySet() + "입니다");
			System.out.print("렌트하실 차를 입력해주세요 : ");
			rentName = sc.next();
			if(garage.get(rentName) != null) {

				System.out.print("운행할 시간을 입력해주세요(시간) : ");

				runTime = sc.nextInt();	
				carName = garage.get(rentName);

				try {				

					//해당하는 Car 객체 생성
					Class car = Class.forName(carName);
					Constructor carConst = car.getConstructor();
					Object oCar = carConst.newInstance();
					
					//Car 객체에 setTime 메소드를 호출해서 time 값 설정해줌
					Method methods[] = car.getDeclaredMethods();
					java.lang.reflect.Method carRun = car.getMethod("setTime", int.class);
					carRun.invoke(oCar, runTime);
					
					//Car 객체의  스레드 실행 (운행)
					for(int i=0; i<MAX_RENT_COUNT; i++) {
						Thread t = new Thread((Runnable) oCar, rentName+(i+1));
						t.start();
					}


				}catch(Throwable e) {
					System.err.println(e);
				}

			} else { System.out.println("차고에 해당 차가 없습니다.\n 다시 입력해 주세요"); }	
		}
	}
}

 

728x90
반응형

'Java' 카테고리의 다른 글

JAVA HashMap 함수들 정리  (0) 2023.02.07
[JAVA] Collection Framework  (0) 2020.03.16
ThreadLocal  (0) 2020.03.10

댓글