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
반응형
'BackEnd > Java' 카테고리의 다른 글
[java] 이것이 자바다 ch13 제네릭(Generic) (0) | 2023.01.21 |
---|---|
[java] 이것이 자바다 ch12 어노테이션(annotation) (0) | 2023.01.21 |
[java] 이것이 자바다 ch12 정규 표현식 클래스 (0) | 2023.01.21 |
[java] 이것이 자바다 ch12 날짜와 시간 클래스 (0) | 2023.01.20 |
[java] 이것이 자바다 ch12 수학(Math) 클래스 (0) | 2023.01.19 |