Dev 달팽이 @_''

Java - 리플렉션 API(클래스 정보 조회) 본문

Java&Spring/더 자바, 코드를 조작하는 다양한 방법

Java - 리플렉션 API(클래스 정보 조회)

다본죽 2022. 1. 9. 16:40

Java - 리플렉션 API(클래스 정보 조회)

자바 리플렉션(Java Reflection)

  • 리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법
  • 스프링에서 BeanFactory는 어플리케이션이 실행한 후 객체가 호출 될 당시 객체의 인스턴스를 사용
  • 이 때 필요한 기술이 리플렉션
  • Class<T> : https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

Class<T>에 접근하는 방법

public class App {
    public static void main(String[] args) throws ClassNotFoundException {

        // 방법 1. 모든 클래스를 로딩 한 다음 Class<T>의 인스턴스가 생김
        // 타입.class로 접근할 수 있음
        Class<Book> bookClass = Book.class;

        // 방법 2. 모든 인스턴스는 getClass() 메소드를 가지고 있음
        // 인스턴스.getClass()로 접근할 수 있음
        Book book = new Book();
        Class<? extends Book> aClass = book.getClass();

        // 방법 3. 클래스를 문자열로 읽어오는 방법
        // Class.forName(FQCN)
        // 클래스 패스에 해당하는 클래스가 없으면 ClassNotFoundException이 발생
        Class<?> aClass1 = Class.forName("org.example.Book");
    }
}

 

Class API의 활용

 

Book.java

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 100;
    }
}

 

public 필드 출력

 

App.java

Class<Book> bookClass = Book.class;

//bookClass.getFields()는 public만 리턴
Arrays.stream(bookClass.getFields()).forEach(System.out::println);

 

모든 필드 출력

//모든 필드를 출력
Arrays.stream(bookClass.getDeclaredFields()).forEach(System.out::println);

 

접근 지시자 무시하고 값 가져오기

 

 //값을 가져올 때는 인스턴스가 필요함
Book book = new Book();

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();
        }
});

 

메소드 가져오기

 

//메소드 가져오기
Arrays.stream(bookClass.getMethods()).forEach(System.out::println);

Object에 상속받은 메소드도 모두 가져온다.

 

생성자 가져오기

 

// 생성자 가져오기
Arrays.stream(bookClass.getDeclaredConstructors()).forEach(System.out::println);