Class 클래스는 클래스의 정보(메타 데이터, meta data)를 다루는데 사용된다. Class 클래스를 실행중인 자바 애플리케이션 내에서 필요한 클래스의 속성과 메서드에 대한 정보를 조회 및 조작할 수 있다.
Class.forName()
메서드로 클래스를 동적으로 로드하고, newInstance()
메서드로 새로운 인스턴스 생성메서드 | 설명 | 예외처리 |
---|---|---|
forName(String className) | 지정한 이름의 클래스를 로드한다. | ClassNotFoundException |
newInstance() | 클래스의 기본 생성자를 사용하여 새로운 인스턴스를 생성합니다. (Java 9부터는 사용 권장되지 않음) | InstantiationException, IllegalAccessException |
getName() | 클래스의 이름을 반환합니다. 패키지 경로를 포함한 정규 클래스 이름을 반환합니다. | |
getSimpleName() | 클래스의 간단한 이름을 반환합니다. 패키지 경로를 제외한 클래스 이름을 반환합니다. | |
getSuperclass() | 클래스의 슈퍼클래스를 반환합니다. Object 클래스의 경우 null을 반환합니다. | |
getMethods() | 현재 클래스 및 슈퍼클래스의 모든 public 메서드를 반환합니다. | SecurityException |
getDeclaredMethods() | 현재 클래스에 선언된 모든 메서드를 반환합니다. 접근 제어자에 관계없이 모든 메서드를 반환합니다. | SecurityException |
getFields() | 현재 클래스 및 슈퍼클래스의 모든 public 필드를 반환합니다. | SecurityException |
getDeclaredFields() | 현재 클래스에 선언된 모든 필드를 반환합니다. 접근 제어자에 관계없이 모든 필드를 반환합니다. | SecurityException |
getConstructors() | 현재 클래스의 모든 public 생성자를 반환합니다.SecurityException |
예시로 String
클래스의 메타데이터를 조회해보자.
public class ClassMetaDataMain {
public static void main(String[] args) throws Exception {
// 1. Class 조회
// 1-1.클래스에서 조회
Class clazz1 = String.class;
// 1-2. 인스턴스에서 조회
Class clazz2 = new String().getClass();
// 1-3. 문자열로 조회
Class clazz3 = Class.forName("java.lang.String");
// 2. 모든 필드 조회
Field[] fields = clazz1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getType() + ", " + field.getName());
}
// 3. 모든 메서드 조회
Method[] methods = clazz1.getDelcaredMethods();
for (Method method : methods) {
System.out.println(method);
}
// 4. 상위 클래스 정보 조회
System.out.println(clazz1.getSuperclass().getName());
// 5. 인터페이스 정보 조회
Class[] interfaces = clazz1.getInterfaces();
for (Class interface : interfaces) {
System.out.println(interface.getName());
}
}
}
Class.forName()
을 사용하면 ClassNotFoundException
이 발생할 수도 있기 때문에 throws ClassNotFoundException
또는 throws Exception
이 필요하다.클래스를 생성하고 클래스의 메타데이터를 조회하여 인스턴스를 생성해보자.
public class Book {
public String getBook() {
return "Book{Author: Hermann Hesse, Title: Demian}";
}
}
public class ClassCreateMain {
public static void main(String[] args) throws Exception {
// 1. 클래스 조회
// 1-1. 클래스에서 조회
Class<Book> bookClass1 = Book.class;
// 1-2. 문자열로 조회
Class bookClass2 = Class.forName("lang.clazz.Book");
// 2. 생성자를 얻어서 객체 생성
// 2-1. Class 객체 이용
Book book1 = (Book) bookClass1.getDeclaredConstructor().newInstance();
// 2-2. new 연산자 사용
Book book2 = (Book) new Book();
String result = book1.getBook();
System.out.println(result);
}
}
newInstance()
를 사용하면 InstantiationException
또는 IllegalAccessException
이 발생할 수 있으므로 예외처리를 해야한다.