publicclassBook {privateString a;privatestaticString B ="BOOK";privatestaticfinalString C ="BOOK";publicString d ="d";protectedString e ="e";publicBook() { }publicBook(String a,String d,String e) {this.a= a;this.d= d;this.e= e; }privatevoidf() {System.out.println("F"); }privatevoidg() {System.out.println("g"); }privateinth() {return100; }}publicinterfaceMyInterface {}publicclassMyBookextendsBookimplementsMyInterface{}
publicclassApp {publicstaticvoidmain(String[] args) throwsClassNotFoundException {// 클래스 타입에 접근하는 방법// 1. 해당 타입을 가지고 가져오기Class<Book> bookClass1 =Book.class;// 2. 이미 있는 인스턴스에서 가져오기Book book =newBook();Class<?extendsBook> bookClass2 =book.getClass();// 3. FQCN으로 가져오기 Class<?> bookClass3 =Class.forName("me.dodeon.Book");// 정보 가져오기// 1. public한 필드만 가져오기Arrays.stream(bookClass.getFields()).forEach(System.out::println); // 2. 접근 지정자 상관없이 가져오기Arrays.stream(bookClass.getDeclaredFields()).forEach(System.out::println); }}
이밖에도 상위 클래스, 인터페이스, 애너테이션, 생성자 등 다양한 정보를 불러올 수 있다.
애너테이션과 리플렉션
public @interfaceMyAnnotation {}@MyAnnotationpublicclassBook {}
내가 아무리 애너테이션을 커스텀으로 만들어서 붙여도 getAnnotations()를 실행하면 조회되지 않는다. 애너테이션은 기본적으로 주석과 같은 취급을 받기 때문에 정보가 클래스까지는 남지만 바이트코드를 로딩했을 때 메모리 상에 남지는 않는다.