Reflection - Class 정보 조회

현시기얌·2022년 2월 21일

Reflection

목록 보기
1/4
post-thumbnail

Class<T> 에 접근하는 방법

  1. 모든 Class를 로딩 한 다음 Class<T>의 인스턴스가 생긴다. "타입.class"로 접근할 수 있다.
  2. 모든 인스턴스는 getClass() 메소드를 가지고 있다. "인스턴스.getClass()"로 접근할 수 있다.
  3. Class를 문자열로 읽어오는 방법 :
    • Class.forName("FQCN")
    • ClassPath에 해당 Class가 없다면 ClassNotFoundException이 발생한다.

Class<T>를 통해 할 수 있는 것

  • Field(목록) 가져오기
  • Method(목록) 가져오기
  • 상위 Class 가져오기
  • Interface(목록) 가져오기
  • Annotation 가져오기
  • 생성자 가져오기
public class Book {

    private static String B = "Book";
    private static final String C = "Book";

    private String a = "a";

    public String d = "d";

    protected String e = "e";

    public Book() {

    }

    public Book(String a, String d, String e) {
        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 1000;
    }
}

Field 목록 가져오기

        Arrays.stream(bookClass.getFields()).forEach(System.out::println);

실행결과

위와 같이 Field는 Public한 Field만 가져온다.

모든 Field를 가져오고 싶으면?

        Arrays.stream(bookClass.getDeclaredFields()).forEach(System.out::println);

실행결과

getDeclaredFields() 메소드를 사용하면 된다.

Field의 값을 가져오고 싶으면?

Arrays.stream(bookClass.getDeclaredFields()).forEach(f -> {
            try {
                f.setAccessible(true);
                System.out.printf("%s %s \n", f, f.get(book));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });

실행결과

위와 같이 setAccessible(true)를 사용하면 private한 값에도 접근이 가능하다.

Method 가져오기

        Arrays.stream(bookClass.getMethods()).forEach(System.out::println);

bookClass의 메소드 뿐만 아니라 Object의 메소드도 출력된다.

profile
현시깁니다

0개의 댓글