구체적인 클래스 타입을 알지 못해서 그 클래스의 메소드와 타입 그리고 변수들을 접근할 수 있도록 해주는 자바 API
런타임에 지금 실행되고 있는 클래스를 가져와서 실행해야되는 경우
동적으로 객체를 생성하고 메서드를 호출하는 방법
자바의 리플렉션은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경하거나 메소드를 호출할 수 있다.
코드를 작성하는 시점에는 어떤 타입의 클래스를 사용할지 모르지만 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우
프레임 워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공
ex) 스프링의 어노테이션이 리플렉션을 이용
Class clazz = Child.class;
clazz.getName(); //Child Class를 알고 있을 때
//클래스 이름만으로 클래스 정보를 가져온다
Class clazz2= Class.forName("Child");
clazz2.getName(); //Child
Class clazz= Class.forName("Child");
Constructor cons=clazz.getDeclaredConstructor(); //생성자 가져오기
Constructor cons2=clazz.getDeclaredConstructor(param); //넣은 인자의 타입과 일치하는 생성자 가져오기
Constructor cons3[]=clazz.getDeclaredConstructors(); //모든 생성자 가져오기
Class clazz= Class.forName("Child");
Method method1=clazz.getDeclaredMethod("method4",int.class);
// 메소드를 찾을 때 존재하지 않으면 NoSuchMethodException 에러 발생
Class clazz= Class.forName("Child");
Field field = clazz.getDeclaredField("param"); //해당 필드 가져오기
Field fields[] = clazz.getDeclaredFields(); //모든 필드 가져오기