리플렉션의 시작은 Class<T>
Class<T>에 접근하는 방법
- 모든 클래스를 로딩 한 다음 Class<T>의 인스턴스가 생긴다. “타입.class”로 접근할 수 있다.
- 모든 인스턴스는 getClass() 메소드를 가지고 있다. “인스턴스.getClass()”로 접근할 수 있다.
- 클래스를 문자열로 읽어오는 방법
- Class.forName(“FQCN”)
- 클래스패스에 해당 클래스가 없다면 ClassNotFoundException이 발생한다.
Class<T>를 통해 할 수 있는 것
- 필드 (목록) 가져오기
- 메소드 (목록) 가져오기
- 상위 클래스 가져오기
- 인터페이스 (목록) 가져오기
- 애노테이션 가져오기
- 생성자 가져오기
예시
public class MyBook extends Book implements MyInterface {
}
public class Book {
private String a = "a";
private static String B = "BOOK";
private static final String C = "BOOK";
public String d = "d";
protected String e = "e";
public Book() {
}
public Book(String a, String d, String e) {
super();
this.a = a;
this.d = d;
this.e = e;
}
private void f() {
System.out.println("F");
}
public void g() {
System.out.println("g");
}
public int h() {
return 100;
}
}
public interface MyInterface {
}
public class StartMain {
public static void main(String[] args) throws ClassNotFoundException {
// 클래스 타입을 이용해서 가져오기
Class<Book> bookClass = Book.class;
Book book = new Book();
// 클래스 인스턴스를 이용해서 가져오기
Class<? extends Book> aClass = book.getClass();
// 클래스 위치로 접근할 때
Class<?> aClass1 = Class.forName("kr.co.study.test");
}
}