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 |
댓글