수정자, 필드, 생성자, 메서드를 포함한 클래스의 모든 메타데이터를 동적으로 분석하고 사용하는 걸 리플렉션이라 한다. 클래스의 메타데이터를 조회하는 방법으로는 세 가지가 있다.
// 1. 클래스로 찾기
Class<BasicData> basicDataClass1 = BasicData.class;
System.out.println("basicDataClass = " + basicDataClass1);
// 2. 인스턴스로 찾기
BasicData basicInstance = new BasicData();
Class<? extends BasicData> basicDataClass2 = basicInstance.getClass();
System.out.println("basicDataClass2 = " + basicDataClass2);
// 3. 문자로 찾기
String className = "reflection.data.BasicData"; // 패키지명 주의
Class<?> basicDataClass3 = Class.forName(className);
System.out.println("basicDataClass3 = " + basicDataClass3);
이렇게 세 가지 방법이 있다. 참고로 Class<? extends BasicData> 이 부분은 BasicData뿐만 아니라 BasicData에게 상속 받은 자식클래스까지 올 수 있다는 말이다.
클래스, 인스터스, 문자로 만들어 놓으면 getName, getPackage, getSuperClass, getInterfaces, isEnum, isAnnotation 등의 메서드를 사용할 수 있다.
특히 수정자도 확인할 수 있는데 getModifiers를 사용하면 된다. 다만, 수정자 조합된 숫자를 반환해주기 때문에 isPublic 같은 걸로 얻은 걸 확인해 보거나 toString으로 변환시켜주어야 한다.