본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch12 리플렉션(reflection)

728x90
반응형

1. 리플렉션

   ▷ Class 객체로 관리하는 클래스와 인터페이스의 메타 정보를 프로그램에서 읽고 수정하는 것

   ▷ 메타 정보 : 패키지 정보, 타입 정보, 멤버(생성자, 필드, 메소드) 정보

1. 클래스로부터 얻는 방법
   ▷ Class clazz = 클래스이름.class;
   ▷ Class clazz = Class.forName("패키지...클래스이름");

2. 객체로부터 얻는 방법
   ▷ Class clazz = 객체참조변수.getClass();

 

◎ 리플렉션 예제

◎ Car 클래스
public class Car {
}​


◎ GetClassExample 메인 클래스
public class GetClassExample {
	public static void main(String[] args) throws Exception {
		//how1
		Class clazz = Car.class;
		
		//how2
		//Class clazz = Class.forName("ch12.sec11.exam01.Car");
		
		//how3
		//Car car = new Car();
		//Class clazz = car.getClass();
		
		System.out.println("패키지 : " + clazz.getPackage().getName());
		System.out.println("클래스 간단 이름 : " + clazz.getSimpleName());
		System.out.println("클래스 전체 이름 : " + clazz.getName());
	}
}

//	출력  :
//	패키지 : reflection
//	클래스 간단 이름 : Car
//	클래스 전체 이름 : reflection.Car​

 

 

2. 패키지와 타입 정보 얻기

   ▷ 패키지와 타입(클래스, 인터페이스) 이름 정보는 다음 메소드로 얻을 수 있습니다.

 

◎ 패키지 타입 정보 얻기 예제

◎ Car 클래스
public class Car {
	private String model;
	private String owner;
	
	public Car() {
	}
	
	public Car(String model) {
		this.model = model;
	}
	
	public String getModel() { return model; }
	public void setModel(String model) { this.model = model; }
	public String getOwner() { return owner; }
	public void setOwner(String owner) { this.owner = owner; }
}​


◎ Car 클래스
import java.lang.reflect.*;

public class ReflectionExample {
	public static void main(String[] args) {
		Class clazz = Car.class;
		System.out.println("[생성자 정보]");
		Constructor[] constructors = clazz.getDeclaredConstructors();
		for(Constructor constructor : constructors) {
			System.out.print(constructor.getName() + "(");
			Class[] parameters = constructor.getParameterTypes();
			printParameters(parameters);
			System.out.println(")");
		}
		System.out.println();
		
		System.out.println("[필드 정보]");
		Field[] fields = clazz.getDeclaredFields();
		for(Field field : fields) {
			System.out.println(field.getType().getName() + " " + field.getName());
		}
		System.out.println();
		
		System.out.println("[메소드 정보]");
		Method[] methods = clazz.getDeclaredMethods();
		for(Method method : methods) {
			System.out.print(method.getName() + "(");
			Class[] parameters = method.getParameterTypes();
			printParameters(parameters);
			System.out.println(")");
		}
		System.out.println();
	}
	
	private static void printParameters(Class[] parameters) {
		for(int i=0; i<parameters.length; i++) {
			System.out.print(parameters[i].getName());
			if(i<(parameters.length-1)){
				System.out.print(",");
			}
		}
	}
}


//	출력 : 
//	[생성자 정보]
//	reflection01.Car()
//	reflection01.Car(java.lang.String)
//	
//	[필드 정보]
//	java.lang.String model
//	java.lang.String owner
//	
//	[메소드 정보]
//	getOwner()
//	setOwner(java.lang.String)
//	setModel(java.lang.String)
//	getModel()​

 

 

3. 리소스 경로 얻기

   ▷ Class 객체는 클래스 파일(~.class)의 경로 정보를 기준으로 상대 경로에 있는

       다른 리소스 파일(이미지, XML, Property 파일)의 정보를 얻을 수 있습니다.

 

◎ 리소스 경로 얻기 예제

◎ Car 클래스
public class Car {
}​


◎ GetResourceExample 메인 클래스
public class GetResourceExample {
	public static void main(String[] args) {
		Class clazz = Car.class;
		
		String photo1Path = clazz.getResource("photo1.jpg").getPath();
		String photo2Path = clazz.getResource("images/photo2.jpg").getPath();
		
		System.out.println(photo1Path);
		System.out.println(photo2Path);
	}
}

//	출력 : 
//	/C:/javawork/java0120/bin/reflection02/photo1.jpg
//	/C:/javawork/java0120/bin/reflection02/images/photo2.jpg​


패키지 명에 .을 붙이면 폴더를 하나 더 생성할 수 있습니다.

예를 들면)
reflection02.test면
reflection02 폴더 안에 test 폴더를 생성해서 파일들을 넣을 수 있습니다.

 

리플렉션은 현재 생성자명, 패키지명, 메소드명 등을 모두 확인할 수 있습니다.

 

해당 클래스에서 어떤 멤버들이 사용되었는지 확인할 수 있겠죠?

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

 

728x90
반응형