클래스와 인터페이스의 메타 데이터를 java.lang 패키지에 소속된 Class 클래스로 관리
*메타 데이터란 클래스의 이름, 생성자 정보, 필드 정보, 메소드 정보를 말함
Class 객체 얻기 (getClass(), forName())
프로그램에서 Class 객체를 얻기 위해서는 Object 클래스가 가지고 있는
geeClass() 메소드를 이용하면 된다
Class class = obj.getClass()
getClass() 메소드는 해당 클래스로 객체를 생성했을 때만 사용
객체를 생성하기 전 직접 Class 객체를 얻을 수 잇다.
Class는 생성자를 감추고 있기 때문에 new 연산자로 객체를 만들수 없다
정적 메소드인 forName()을 이용
forName() 메소드는 클래스 전체이름(패키지가 포함된 이름)을 매개값으로 받고 Class 객체를 리턴한다
try {
Class clazz = Class.forName(String className);
} catch (ClassNOtFoundException e){
}
리플렉션(getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods())
Class 객체를 이용하면 클래스의 생성자, 필드, 메소드 정보를 알아 낼수 있다
-> 이것은 리플렉션(Reflection) 라고 함
Class 객체는 리플렉션을 위해 getDeclaredConstructors(), getDeclaredFields(), getDeclasredMehtods() 를 제공
Constructor[] constructors = clazz.getDeclaredConstructors();
Field[] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();
세 메소드는 각각 Constructor 배열, Field 배열, Method 배열을 리턴
Constructor, Field, Method 클래스는 모두 java.lang.reflect 패키지에 소속 되어 있다.
getDeclaredFields(), getDeclaredMethods() 는 클래스에 선언된 멤버만 가져오고 상속된 멤버는 가져오지 않는다.
상속된 멤버를 얻고 싶다면 getFields(), getMethods() 를 이용 해야한다.
단 getFields(), getMethods() 는 public 멤버만 가져온다
동적 객체 생성(newInstance())
class 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체를 생성할수 있다.
이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정 되는 경우에
매우 유용하게 사용
try{
Class clazz = Class.forName("런타임시 결정되는 클래스 이름");
Object obj = clazz.newInstance();
} catch (ClassNotFoundException e){
} catch (InstantiationException e){
} catch (IllegalAccessException e ){
}
newInstance() 메소드는 기본생성자를 호출해서 객체를 생성하기 떄문에 반드시 클래스에 기본 생성자가 존재해야함
매개변수가 있는 생성자를 호출하고 싶다면 리플렉션으로 Constructor 객체를 얻어 newInstance() 메소드를 호출하면 됨
newInsatnce() 메소드는 두가지 예외가 발생할수 있다
InstantiationException 예외는 해당 클래스가 추상 클래스이거나 인터페이스 일때 발생
IllegalAccessException 예외는 클래스나 생성자가 접근 제한자로 인해 접근할 수 없을 경우에 발생
newInstance() 메소드의 리턴 타입은 Object이므로 이것을 원래 클래스 타입으로 변환해야만 메소드 사용가능
-> 강제 타입 변환 필요 but 클래스 타입을 모르는 상태이므로 변환을 할수 없음
-> 이문제를 해결하려면 인터페이스 사용 필요
Class clazz = Class.forName("SendAction" || "ReciveAction");
Action action = (Action) clazz.newInstance();
action.execute();
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
| StringTokenizer 클래스 (0) | 2021.10.24 |
|---|---|
| String 클래스 (0) | 2021.10.23 |
| System 클래스 (0) | 2021.10.23 |
| Objects 클래스 (0) | 2021.10.22 |
| Object 클래스 (0) | 2021.10.22 |