자바의 리플렉션을 이용하면 클래스의 정보를 얻는 것외에도, 해당 정보를 통해 객체를 생성하거나 메소드를 실행시키는 행위 등을 할 수 있다.
객체 생성
자바는 new 연산자와 생성자를 통해 객체를 생성한다. 그러므로 먼저 생성자(Constructor)를 얻어와야 한다.
생성자 목록은 아래와 같이 얻을 수 있다.
Constructor[] constructors = testClass.getConstructors();
특정 생성자를 얻는 방법이다. 인자로 생성자의 파라미터를 전달해주면 된다. 가변 인자를 받고 있으므로 2개 이상일 경우 계속 나열해주면 된다. 아니면 배열로 전달해줘도 된다.
ex)
Constructor constructor = testClass.getConstructor(String.class); // 파라미터 1개
Constructor constructor = testClass.getConstructor(new Class[] {String.clsss, String.class, Integer.class}); // 파라미터 두개
(인자로 전달한 파라미터에 맞는 생성자가 없으면 NoSuchMethodException이 발생한다.
Constructor 클래스의 newInstance(Object...initargs)를 사용하면된다.
그럼 User 클래스를 리플렉션을 이용해서 생성해보겠다.
package reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Main01 {
public static void main(String[] args) throws NoSuchMethodException {
Class userClass = UserDto.class;
Constructor cs = userClass.getConstructor(new Class[] {String.class, String.class, String.class, Integer.class});
try {
UserDto userDto = (UserDto)cs.newInstance("alpha", "beta", "gamma", 99);
System.out.println(userDto.toString());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
결과
UserDto [id=alpha, pwd=beta, name=gamma, birthDate=99]
newInstance의 반환형이 Object라 캐스팅이 필요하다.
또한 newInstance시에 인자의 개수가 위에서 얻어온 Constructor의 파라미터 개수와 맞지 않을 경우
IllegalArgumentException이 발생한다.
출처:
'자바' 카테고리의 다른 글
비트 연산 (0) | 2020.11.21 |
---|---|
문자열 붙이기 (0) | 2020.11.18 |
날짜 포맷 설정(SimpleDateFormat) (0) | 2020.11.16 |
스프링 컨테이너 (0) | 2020.11.15 |
MessageFormat (0) | 2020.11.15 |